【发布时间】:2018-05-20 10:52:19
【问题描述】:
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); 得到两个不同的结果,但这个技巧似乎不太正确。
【问题讨论】:
-
你为什么期望第二个使用复制构造函数?
56是int,而不是UnusualClass -
您似乎对 copy constructor 调用感到困惑 copy-initialization syntax。 copy-initialization 只会在参数是对同一个类的对象的引用时导致 copy constructor 调用。
-
为第二个提供copy-ctor的要求可能不直观,但省略不是必需的。因此,它必须是可用的,至少通过声明,即使它最终没有被使用。这样想吧。从 56 构造 temporary
UnusualClass会调用直接 ctor。然后复制ctor 将被调用,从临时创建k2,但是通过省略,一半消失了。 -
复制构造函数将与
UnusualClass k2 = k1;一起使用 -
k2的初始化是'隐式'而不是'复制初始化'。
标签: c++ class constructor initialization