Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;,下面的代码是如何工作的?_C++ - Fatal编程技术网

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
    class
    es和
    struct
    s默认初始化,这实际上意味着调用了它们的构造函数
  • POD(特别是基元类型)没有初始化
相反,如果指定括号,则始终执行默认初始化,对于基元类型,这意味着零初始化

完整的故事在§5.3.4¨15中解释;默认初始化包含在§8.5中


相关标准报价:

创建新表达式的新表达式 类型为T的对象初始化 反对意见如下:

  • 如果省略了新的初始值设定项:
    • 如果
      T
      是(可能符合cv条件的)非POD类类型(或 数组),对象为 如果
      T
      const
      -限定类型,底层 类类型应声明一个用户 默认构造函数
    • 否则,创建的对象具有不确定的值。如果
      T
      const
      -限定类型,或 cv合格)吊舱类类型(或阵列 (直接或间接地)包含 (间接地)成员 const限定类型,程序为 畸形的
  • 如果新初始值设定项的格式为
    ()
    ,则默认初始化 应执行(8.5)
  • 如果新初始值设定项的形式为(表达式列表)且
    T
    为 类类型,相应的 调用构造函数,使用 表达式列表作为参数 (8.5);
  • 如果新的初始值设定项的形式为(表达式列表)且T为 算术、枚举、指针或 指向成员类型和 表达式列表正好包含一个 表达式,则对象为 初始化为(可能是 表达式的(已转换)值 (8.5); — 否则,新表达式 他身体不好

(§5.3.4¨15)

它自动调用默认构造函数。您也可能会遇到以下情况:

Test t1;
Test t3 = Test();

它们都具有调用默认构造函数的相同效果。

错误,请参阅。不是真正等效的…@ybungalobill:问题具体是关于提供了ctor的类型。第二种情况与其他情况完全不同:它声明了一个不接收参数并返回
测试的函数。其他两种情况也有所不同,第一种“默认初始化”
t1
,最后一种“值初始化”是一个临时副本,用于构建
t3
。POD类型(默认值=未初始化,值=零初始化)可以看出默认值和值初始化之间的差异,虽然大多数/所有编译器都会忽略副本,但编译器必须检查是否有可用的副本构造函数(如果声明为私有,则会失败)@David,+1感谢您指出,关于第二个案例,你是对的,我编辑了我的帖子。但关于第一个,我不认为有任何东西是未初始化的对象,因为构造函数总是被调用的,所以如果默认构造函数被重载,它就会被初始化。我并不是说这些例子和前面提到的一样,只是说他可能会遇到这些,这些都是调用默认构造函数的方法,如果我错了,请纠正我。