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更具体。嗯。