Gla*_*tar 5 c++ constructor initialization class
class UnusualClass
{
int a;
public:
UnusualClass(int a){std::cout<<"Direct initialization"<<std::endl;}
UnusualClass(const UnusualClass &n){std::cout<<"Copy initialization"; }
};
int main ()
{
UnusualClass k1(5); //Direct initialization
UnusualClass k2=56; //Copy initialization
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器会打印两次"直接初始化"?我做了一些研究,发现我可能会得到复制构造函数elision.在这两种情况下,是否有可能获得两种不同的结果?此外,当我使用时,UnusualClass(const UnusualClass &n)=delete我得到一个错误说use of deleted function 'UnusualClass::UnusualClass(const UnusualClass&).如果它跳过这个构造函数,为什么我会得到这个错误?
我知道通过使用两个构造函数我可以得到两个不同的结果UnusualClass(int a);,UnusualClass(double b);但这个技巧似乎不太合适.
这不是copy initialization:
UnusualClass k2=56; // NOT Copy initialization
// for 56 is not of type UnusualClass
Run Code Online (Sandbox Code Playgroud)
它将调用构造函数:
UnusualClass(int a)
Run Code Online (Sandbox Code Playgroud)
我想你的意思是:
UnusualClass k1(5); //Direct initialization
UnusualClass k2{k1}; //Copy initialization
UnusualClass k2 = k1; //Copy initialization
Run Code Online (Sandbox Code Playgroud)
请注意 中所需的类型copy initialization。
UnusualClass(const UnusualClass &n) // const reference to type UnusualClass
Run Code Online (Sandbox Code Playgroud)
它应该是对象的类型UnusualClass,而不是int
更新
我收到一条错误消息,提示使用已删除的函数
Run Code Online (Sandbox Code Playgroud)UnusualClass::UnusualClass(const UnusualClass&).如果它无论如何都会跳过此构造函数,为什么我会收到此错误?
UnusualClass::UnusualClass(const UnusualClass&) = delete;
Run Code Online (Sandbox Code Playgroud)
方法:
避免隐式生成复制构造函数。
因此,您需要定义自己的复制构造函数。
更新2
更多参考@songyuanyao的回答copy-initialization