C++为什么调用复制构造函数
C++ Why was the copy constructor called?
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)
,以在B
的explicit
构造函数中生成名为aa
的A
实例。
您可以删除复制构造函数并使其仍然有效的原因是,在您还没有声明移动构造函数的情况下,编译器将为您生成一个复制构造函数。
注意:编译器生成的复制构造函数通常不足以用于复杂类,它执行简单的成员复制,因此对于复杂元素或动态分配的内存,您应该声明自己的
§15.8.1
如果类定义没有显式声明复制构造函数,则隐式声明非显式构造函数。如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的副本构造函数被定义为已删除;否则,它被定义为默认值(11.4)。如果类具有用户声明的复制赋值运算符或用户声明的析构函数或赋值运算符。
复制发生的原因
查看您的class B
c'tor:
class B {
public:
explicit B(A aa) {}
};
您收到值的A,在通话过程中触发复制。
如果您想将其更改为(注意A & aa
):
class B {
public:
explicit B(A & aa) {}
};
不会有任何副本。。。
默认复制构造函数
当你删除c'tor时,编译器会为你生成一个简单的代码:
首先,您应该明白,如果您不声明副本构造函数,编译器会隐式地为您提供一个构造函数。隐含的复制构造函数执行源对象的成员复制。
默认c'tor等效于:
MyClass::MyClass( const MyClass& other ) :
x( other.x ), c( other.c ), s( other.s ) {}
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 使用复制构造函数复制双精度数组
- C 无可行的构造函数复制类型的变量
- 没有可行的构造函数复制类型 'MyString' 的数组元素
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 如何最小化调用列表构造函数(复制构造函数)的次数?
- C 11矢量构造函数复制与范围
- 我定义了一个非复制构造函数;复制构造函数还会被隐式定义吗
- 可以将构造函数复制为转换运算符
- 将基类指针的构造函数复制到子类
- C++树类:构造函数/复制/内存泄漏
- 如何制作这个在模板构造函数复制中使用类型定义的类型的模板
- 将构造函数复制为模板化的成员函数
- 绕过私有复制构造函数/复制赋值C++
- C++通过构造函数复制对象
- 复制构造函数 - 复制C++中的对象
- 将带unique_ptr的类的构造函数复制到作为成员的抽象类