规则是,如果您需要提供:
那么您可能需要提供所有三个。这条规则被称为三规则。
不声明复制构造函数是否安全?
这是安全的。
您是否必须为您的示例案例?
并不真地。具体来说,三法则支配着这一点。检查链接的问题以获取更多详细信息。
默认的复制构造函数是什么样子的?
我认为这是在问,默认的复制构造函数是做什么的。
答案在:
C++03 标准 12.8 复制类对象:
第 8 段:
类 X 的隐式定义的复制构造函数执行其子对象的成员复制。复制的顺序与用户定义的构造函数中基和成员的初始化顺序相同(见 12.6.2)。每个子对象都以适合其类型的方式复制:
— 如果子对象是类类型,则使用该类的复制构造函数;
— 如果子对象是一个数组,则以适合元素类型的方式复制每个元素;
— 如果子对象是标量类型,则使用内置赋值运算符。
虚拟基类子对象只能由隐式定义的复制构造函数复制一次(见 12.6.2)。
即使我不声明复制构造函数,调用时也会调用默认的构造函数operator=()
仅当需要创建类对象的副本时才调用复制构造函数。这涉及在传递到函数或从函数返回时创建的对象的副本。
您的复制赋值运算符A
按值传递对象,这种按值传递是通过通过复制构造函数传递对象的副本并因此调用复制构造函数来实现的。
为避免复制,您需要通过引用传递:
A& A::operator=(const A& other)
好读:
按引用传递与按值传递有什么区别?