C为什么复制构造函数被调用?
class A { public: A() {} A(const A& a) { cout << "A::A(A&)" << endl; } }; class B { public: explicit B(A aa) {} }; int main() { A a; B b(a); return 0; } 为什么打印“A :: A(A&)”? 什么时候“A”的复制构造函数被称为?如果代码调用了复制构造函数,为什么我可以在不创建编译错误的情况下删除复制构造函数? 解决方法
B(A aa)采用A by值,因此当执行B b(a)时,编译器调用复制构造函数A(const A& a)以在B的显式构造函数中生成名为aa的A实例.
您可以删除复制构造函数并使其仍然有效的原因是,在您尚未声明移动构造函数的情况下,编译器将为您生成复制构造函数. 注意:编译器生成的复制构造函数通常不足以用于复杂的类,它执行简单的成员智能复制,因此对于复杂元素或动态分配的内存,您应该声明自己的.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |