【发布时间】:2010-08-03 15:51:34
【问题描述】:
考虑以下声明和初始化C 类型变量的方法:
C c1;
C c2;
c2 = C();
C c3(C());
C c4 = C();
所有这些是否完全等价,或者其中一些是否可以根据C 的确切定义而有所不同? (假设它具有公共默认构造函数和复制构造函数)。
【问题讨论】:
标签: c++ initialization declaration
考虑以下声明和初始化C 类型变量的方法:
C c1;
C c2;
c2 = C();
C c3(C());
C c4 = C();
所有这些是否完全等价,或者其中一些是否可以根据C 的确切定义而有所不同? (假设它具有公共默认构造函数和复制构造函数)。
【问题讨论】:
标签: c++ initialization declaration
这些意味着:
C c1; // default constructor
C c2; // default constructor
c2 = C(); // default constructor followed by assignment
C c3(C()); // default constructor possibly followed by copy constructor
C c4 = C(); // default constructor possibly followed by copy constructor
注意编译器可以省略复制构造函数调用。它们是等价的吗? - 好吧,这取决于复制构造函数和赋值运算符的作用。
【讨论】:
c3 和 c4 不会编译,但 c2 仍然可以,对吧? (包括作业)。调用func(c2) 怎么样?使用私有复制构造函数也会编译失败吗?
C c3(C()); 和函数声明。您可能需要添加额外的括号以避免编译器警告:C c3((C()));