c ++ - 直接和复制构造函数

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);但这个技巧似乎不太合适.

Jos*_* D. 1

这不是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

更新

我收到一条错误消息,提示使用已删除的函数

UnusualClass::UnusualClass(const UnusualClass&).
Run Code Online (Sandbox Code Playgroud)

如果它无论如何都会跳过此构造函数,为什么我会收到此错误?

UnusualClass::UnusualClass(const UnusualClass&) = delete;
Run Code Online (Sandbox Code Playgroud)

方法:

来自cpreference

避免隐式生成复制构造函数。

因此,您需要定义自己的复制构造函数。

更新2

更多参考@songyuanyao的回答copy-initialization