加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C为什么复制构造函数被调用?

发布时间:2020-12-16 10:44:42 所属栏目:百科 来源:网络整理
导读: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;} 为什么打
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实例.

您可以删除复制构造函数并使其仍然有效的原因是,在您尚未声明移动构造函数的情况下,编译器将为您生成复制构造函数.

注意:编译器生成的复制构造函数通常不足以用于复杂的类,它执行简单的成员智能复制,因此对于复杂元素或动态分配的内存,您应该声明自己的.

§ 15.8.1

If the class definition does not explicitly declare a copy constructor,a non-explicit one is declared implicitly. If the class definition declares a move constructor or move assignment operator,the implicitly declared copy constructor is defined as deleted; otherwise,it is defined as defaulted (11.4). The latter case is deprecated if the class has a user-declared copy assignment operator or a user-declared destructor or assignment operator.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读