默认初始化无法正常工作
Default initialization doesn't work properly
class Example{
public:
int k;
};
int main(){
Example *ex = new Example();
Example *ex1 = new Example;
}
根据我到目前为止所读到的内容,在ex
的情况下,变量k将被值初始化,这意味着等于0,而ex1
将被默认初始化,对于int这样的基本类型,它意味着未定义的行为,但不是0。问题是,当我打印时
cout << ex->k << endl;
cout << ex1->k << endl;
它为两者打印0。为什么?
编辑:根据C++标准-零初始化T类型的对象意味着:
--如果T是标量类型(3.9(,则将对象设置为转换为T的值0(零(
--如果T是非并集类类型,则每个非静态数据成员和每个基类子对象初始化为零
--如果T是并集类型,则对象的第一个命名数据成员初始化为零
--如果T是数组类型,则每个元素初始化为零
--如果T是引用类型,则不执行初始化。
默认初始化T类型的对象意味着:
-如果T是非POD类类型(子句9(,则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化格式错误(
--如果T是数组类型,则默认初始化每个元素
--否则,对象初始化为零。
对T类型的对象进行值初始化意味着:
-如果T是一个具有用户声明构造函数(12.1(的类类型(第9条(,则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化格式错误(
--如果T是一个没有用户声明构造函数的非并集类类型,则T的每个非静态数据成员和基类组件都被值初始化
--如果T是数组类型,则每个元素都被值初始化
--否则,对象为零初始化
现在情况看起来有点不同,在ex1
的情况下,我们有默认初始化,它是POD类,而不是数组,所以对象是零初始化的,那么-如果T是非并集类类型,每个非静态数据成员和每个基类子对象都是零初始化;这意味着k将被初始化为0,并且它不是未定义的行为。正确的
"未定义行为"意味着编译器可以做任何事情。也就是说,当你遇到未定义行为时,编译器将完全有权让恶魔从你的鼻子里飞出来。谢天谢地,在您的情况下,它选择打印0。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- sdl软件渲染器不工作,工作在硬件加速的一个
- C++程序已停止工作-求解常微分方程