C++中关于默认构造函数(Default Constructor)
读<<深度探索C++对象模型>>,第二章介绍了默认构造函数,自觉知识点虽基础但是很是被忽略,故作此文记录.
关于基础概念不做介绍,先看代码
#include <stdio.h>
#include <string>
class Sample{
public:
int intVal;
};
class Foo {
public:
Foo(int a = 1000): intVal(a){
};
int intVal;
};
class Bar {
public:
Foo foo;
Sample sample;
std::string str;
int intVal;
};
void init(){
Bar bar;
printf("bar.foo.intVal: %d\n",bar.foo.intVal);
printf("bar.sample.intVal: %d\n",bar.sample.intVal);
printf("bar.str: %s\n", bar.str.c_str());
printf("bar.intVal: %d \n",bar.intVal);
}
int main() {
init();
return 0;
}
代码简单明了,就是初始一个Bar对象,打印对象的 data member.再拷贝到IDE中之前,不妨猜想一下输出结果
假设已经思考了一段时间,
看下运行结果
运行环境 版本13.3.1 (22E261) Xcode Version 14.3 (14E222b) Apple Clang
foo uninit
bar.foo.intVal: 1000
bar.sample.intVal: 0
bar.str:
bar.intVal: -1074793664
Program ended with exit code: 0
一次试验不足以总结出什么结论,先分析看:
由输出可知:
* Bar成员foo调用了我们自己写的构造函数,将intVal初始化为1000
* Bar成员sample默认初始化了其member intVal为0
* Bar成员intVal 未初始化,值为随机值(可能多次输出相同)
* Bar成员str 初始化为空字符串
接下来将代码放到Windows平台运行
运行环境: window11 vs2019 编译器 对应vs2019的msvc++
foo uninit
bar.foo.intVal: 1000
bar.sample.intVal: -12903328372
bar.str:
bar.intVal: -7392214732
Program ended with exit code: 0
通过对比:
* Bar的intVal成员未初始化
Sample的intVal成员未初始化
大概总结一下:
编译器对于未初始化的字符串member 会自动初始化为空字符
不同编译器对于intVal的初始化行为是不一样的
编译器会默认调用有构造函数的对象构造方法
不要相信编译器

本文来自博客园,作者:严_青,转载请注明原文链接:https://www.cnblogs.com/zhao-jie-li/p/17361618.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?