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;
}
为什么编译器两次打印出“直接初始化”?我进行了一些研究,发现可能会导致复制构造函数省略。
在这两种情况下是否有可能获得两种不同的结果?
另外,当我使用
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
它将调用构造函数:
UnusualClass(int a)
我想你的意思是:
UnusualClass k1(5); //Direct initialization
UnusualClass k2{k1}; //Copy initialization
UnusualClass k2 = k1; //Copy initialization
注意
copy initialization
中所需的类型。UnusualClass(const UnusualClass &n) // const reference to type UnusualClass
它应该是对象的类型,它是
UnusualClass
,而不是int
更新
UnusualClass::UnusualClass(const UnusualClass&) = delete;
方法:
从cppreference
因此,您将需要定义自己的拷贝构造函数。
更新2
有关
copy-initialization
的更多信息,请参见@songyuanyao的答案关于C++-直接和复制构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50434070/