C++ C++;:自动生成(默认)复制构造函数
如果我声明一个类(没有动态内存分配,没有指针): 不声明副本构造函数安全吗?默认的复制构造函数是什么样子的C++ C++;:自动生成(默认)复制构造函数,c++,operator-overloading,copy-constructor,C++,Operator Overloading,Copy Constructor,如果我声明一个类(没有动态内存分配,没有指针): 不声明副本构造函数安全吗?默认的复制构造函数是什么样子的 A& A::operator=(const A other) { a=other.a; b=other.b; return *this; } 即使我没有声明复制构造函数,当我调用操作符=() 编辑: 默认析构函数是: A::~A(){} 因此这里不需要它规则是,如果您需要提供: 复制构造函数或 析构函数 复制赋值运算符 那么您可能需要提供这三个选项。此规
A& A::operator=(const A other)
{
a=other.a;
b=other.b;
return *this;
}
即使我没有声明复制构造函数,当我调用操作符=()
编辑: 默认析构函数是:
A::~A(){}
因此这里不需要它规则是,如果您需要提供:
- 复制构造函数或
- 析构函数
- 复制赋值运算符
不声明副本构造函数安全吗? 它是安全的 您必须为您的示例案例提供支持吗? 不是真的。具体来说,这是由三条规则决定的。查看链接问题以了解有关该问题的更多详细信息
默认复制构造函数是什么样子的? 我想这是在问,默认复制构造函数做什么。
答案如下:
C++03标准12.8复制类对象:
第8段: 类X的隐式定义的复制构造函数执行其子对象的成员复制。复制顺序与用户定义构造函数中基和成员的初始化顺序相同(见12.6.2)。以适合其类型的方式复制每个子对象: -如果子对象是类类型,则使用该类的复制构造函数
-如果子对象是一个数组,则以适合元素类型的方式复制每个元素
-如果子对象是标量类型,则使用内置赋值运算符。
隐式定义的复制构造函数只能复制一次虚拟基类子对象(见12.6.2)
即使我没有声明副本构造函数,当我调用
操作符=()
仅当需要创建类对象的副本时,才会调用复制构造函数。这涉及传递到函数或从函数返回时创建的对象的副本。复制赋值运算符按值传递对象
A
,此传递值通过将对象的副本传递给复制构造函数,从而调用复制构造函数来实现。要避免复制,您需要通过引用传递: 读得好:
您似乎混淆了复制构造函数和复制赋值运算符。隐式生成的复制构造函数将复制每个成员:
A::A( A const& source )
: a( source.a )
, b( source.b )
{}
A& A::operator =( A const& source )
{
a = source.a;
b = source.b;
return *this;
}
隐式生成的复制分配运算符将复制分配每个成员:
A::A( A const& source )
: a( source.a )
, b( source.b )
{}
A& A::operator =( A const& source )
{
a = source.a;
b = source.b;
return *this;
}
您在问题中定义的复制赋值运算符按copy获取
A
,因此将调用copy构造函数来创建传递给operator=
的参数。请注意,在某些情况下,副本可能会被省略。您的类提供了操作符=
。按照三条规则(正如@AlokSave所说),您还应该提供复制构造函数和析构函数
A::A(const A& other) != A& A::operator=(const A other)
问题是,如果您对默认提供的复制构造函数满意,为什么对默认提供的复制赋值运算符不满意?如果是,只需不声明
operator=
,让编译器为您生成整个“三条规则”。您是否混淆了复制构造函数和复制赋值运算符?不,复制赋值运算符是operator=(),复制构造函数是a::a(a&);我明白了,当需要复制时,会调用copy构造函数,因为other
参数是operator=
您可能希望a&operator=(const&a)代码>非A&运算符=(常数A)代码>,它们是非常不同的东西。+1,但我认为这还不足以回答这个问题。这显然很重要,但我认为问题包括“我什么时候必须提供这三个选项中的任何一个?是否没有足够的动态内存或指针来证明我不需要它们?”@us2012:Updated更具体。嗯。