c ++拷贝构造函数和等于运算符

时间:2016-02-02 09:44:08

标签: c++

我举了以下例子来说明我的问题:

// Example program
#include <iostream>
#include <string>

class Abc
{
  private:
     int a_;
  public:
     Abc(int a):a_(a) {};
     Abc& operator = ( const Abc &obj);
     Abc(const Abc &obj);
};

Abc& Abc::operator = ( const Abc &obj)
{
   a_ = obj.a_;
   return *this;
}

Abc::Abc(const Abc &obj)
{
    a_ = obj.a_;
}

int main()
{
  Abc obj1(3);
  Abc obj2=obj1;

  return 0;
}

在上面的代码中,当调用Abc obj2=obj1时,我希望调用Abc& Abc::operator = ( const Abc &obj),而实际调用Abc::Abc(const Abc &obj)。我很困惑。最重要的是,由于a_是一个私有成员变量,因此a_=obj.a_似乎无法访问它。有任何想法吗?谢谢。

3 个答案:

答案 0 :(得分:4)

您需要区分初始化分配

初始化是变量定义时的初始化;你设置了 inital 值。例子:

int i = 2;    // initialization
Abc obj2 = obj1;    // initialization
extern int j;    // this is just a declaration, so no initialization takes place
int j = 2;    // initialization

赋值是对变量的任何后续...赋值。例子:

int i = 2;    // initialization
i = 2;    // ASSIGNMENT

obj2 = obj1;    // assignment

初始化时,将调用复制构造函数。在赋值时,赋值运算符。

关于private成员:操纵private成员a_的函数属于同一个类,因此允许它们访问对象的内部。如果这不是真的,moving(&gt; = C ++ 11)和std::unique_ptr将无法实现。

答案 1 :(得分:2)

Abc obj2=obj1;

您可能认为这会调用赋值运算符,因为它具有=符号,但这是复制初始化,在这种情况下将调用复制构造函数。

只能在已经构造的对象上调用赋值运算符。复制构造是从另一个创建对象,复制分配是将对象分配给已经创建的对象。

Abc obj2 = obj1; //copy construction
obj2 = obj1;     //copy assignment

访问说明符适用于类,而不是在对象中。如果数据成员是类A的私有成员,则A的任何成员函数都可以访问此数据成员,无论它是自己的还是属于另一个实例。

答案 2 :(得分:1)

你仍然在与obj类对应的类成员中,所以即使obj不是这个,它仍然可以访问私有成员。 例如:

class Test {
private:
    int a = 42;
public:
    Test(){}
    void change(Test& test) {
        test.a = 21;
    }

};

int main() {
    Test a;
    Test b;
    a.change(b);
    return 0;
}

C ++保护是在类级别而不是在实例级别。所以问题在于你所在的方法与实例无关。