C++ C++;变量声明和初始化规则
考虑以下声明和初始化C++ C++;变量声明和初始化规则,c++,initialization,declaration,C++,Initialization,Declaration,考虑以下声明和初始化C类型变量的方法: C c1; C c2; c2 = C(); C c3(C()); C c4 = C(); 所有这些都是完全等效的吗?或者,根据C的确切定义,其中一些是否会有所不同?(假设它有公共默认构造函数和复制构造函数)。这意味着: C c1; // default constructor C c2; // default constructor c2 = C(); // default constructor followed by assignme
C
类型变量的方法:
C c1;
C c2;
c2 = C();
C c3(C());
C c4 = C();
所有这些都是完全等效的吗?或者,根据C
的确切定义,其中一些是否会有所不同?(假设它有公共默认构造函数和复制构造函数)。这意味着:
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
注意:编译器可以省略复制构造函数调用。它们相等吗?-好的,这取决于复制构造函数和赋值运算符的操作。请注意,重要的是,即使删除了复制,也要检查需求。也就是说,如果复制构造函数在此级别不可访问(私有/受保护),即使从未调用过复制构造函数,3和4也将无法编译。@David True,但在这种情况下,问题明确指出复制构造函数是公共的。因此,如果复制构造函数是私有的,
c3
和c4
不会编译,但c2
仍然会编译,对吗?(包括任务)。调用func(c2)
-使用私有副本构造函数编译也会失败吗?对于C3,一些编译器(至少Visual Studio)无法区分C3(C())代码>来自函数声明。您可能需要添加额外的括号以避免编译器警告:c3((C())
@rom是的,它会返回一个C值。