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

标签 c++ c++11 copy-constructor

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,因此当您执行 B b(a) 时,编译器会调用复制构造函数A(const A& a)explicit 构造函数中生成名为 aaA 实例B.

您可以删除复制构造函数并使其仍然有效的原因是,如果您还没有声明移动构造函数,编译器将为您生成一个复制构造函数。

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

§ 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.

关于C++ 为什么调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46649360/

相关文章:

c++ - 从另一个文件引用 C++ 类

c++ - 一个结构中的条件变量、互斥锁和标志

c++ - 默认构造函数阻止调用 emplace_back

c++ - 从函数返回期间未调用复制构造函数

c++ - 我如何在 std::vector 中存储没有复制构造函数的类?

C++复制构造函数的奇怪之处

c++ - 将类作为参数传递,但仍使用点运算符?

c++ - 如何在 O(logn) 中查找 STL 中元素的等级

c++ - 使用 opencv 和 C++ 识别和更改亮度和对比度,使其适用于图像处理

c++ - 构造函数委托(delegate)如何与非静态数据成员初始化交互?