C++ 在C++;,下面的代码是如何工作的?
可能重复:C++ 在C++;,下面的代码是如何工作的?,c++,C++,可能重复: 哪些操作由以下代码执行: Test *t1 = new Test; // there is no () after new Test; 如果有用户声明的默认构造函数 那么这个呢: Test *t2 = new Test(); // there is () after new Test; 它们是等价的,在这两种情况下都将调用不带参数的构造函数。对于具有构造函数的structs和classes,它们是相同的,使用空括号的唯一区别是用于基本类型,如果有括号,则初始化为零,否则,它们将
哪些操作由以下代码执行:
Test *t1 = new Test; // there is no () after new Test;
如果有用户声明的默认构造函数
那么这个呢:
Test *t2 = new Test(); // there is () after new Test;
它们是等价的,在这两种情况下都将调用不带参数的构造函数。对于具有构造函数的
struct
s和class
es,它们是相同的,使用空括号的唯一区别是用于基本类型,如果有括号,则初始化为零,否则,它们将保持未初始化状态
事实上,这比那更复杂;如果省略括号:
- 非POD
es和class
s默认初始化,这实际上意味着调用了它们的构造函数李>struct
- POD(特别是基元类型)没有初始化李>
相关标准报价: 创建新表达式的新表达式 类型为T的对象初始化 反对意见如下:
- 如果省略了新的初始值设定项:
- 如果
是(可能符合cv条件的)非POD类类型(或 数组),对象为 如果T
为T
-限定类型,底层 类类型应声明一个用户 默认构造函数const
- 否则,创建的对象具有不确定的值。如果
是T
-限定类型,或 cv合格)吊舱类类型(或阵列 (直接或间接地)包含 (间接地)成员 const限定类型,程序为 畸形的李>const
- 如果
- 如果新初始值设定项的格式为
,则默认初始化 应执行(8.5)李>()
- 如果新初始值设定项的形式为(表达式列表)且
为 类类型,相应的 调用构造函数,使用 表达式列表作为参数 (8.5);李>T
- 如果新的初始值设定项的形式为(表达式列表)且T为 算术、枚举、指针或 指向成员类型和 表达式列表正好包含一个 表达式,则对象为 初始化为(可能是 表达式的(已转换)值 (8.5); — 否则,新表达式 他身体不好
(§5.3.4¨15)它自动调用默认构造函数。您也可能会遇到以下情况:
Test t1;
Test t3 = Test();
它们都具有调用默认构造函数的相同效果。错误,请参阅。不是真正等效的…@ybungalobill:问题具体是关于提供了ctor的类型。第二种情况与其他情况完全不同:它声明了一个不接收参数并返回
测试的函数。其他两种情况也有所不同,第一种“默认初始化”t1
,最后一种“值初始化”是一个临时副本,用于构建t3
。POD类型(默认值=未初始化,值=零初始化)可以看出默认值和值初始化之间的差异,虽然大多数/所有编译器都会忽略副本,但编译器必须检查是否有可用的副本构造函数(如果声明为私有,则会失败)@David,+1感谢您指出,关于第二个案例,你是对的,我编辑了我的帖子。但关于第一个,我不认为有任何东西是未初始化的对象,因为构造函数总是被调用的,所以如果默认构造函数被重载,它就会被初始化。我并不是说这些例子和前面提到的一样,只是说他可能会遇到这些,这些都是调用默认构造函数的方法,如果我错了,请纠正我。