c ++复制构造函数和相等运算符

fee*_*ree 0 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;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,当Abc obj2=obj1被调用时,我期望 Abc& Abc::operator = ( const Abc &obj)会被调用而实际上Abc::Abc(const Abc &obj)被调用。我对此感到困惑。最重要的是,由于它a_是一个私有成员变量,因此在a_=obj.a_似乎可以正常工作时不应访问它。有任何想法吗?谢谢。

cad*_*luk 5

您需要区分初始化分配

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

obj2 = obj1;    // assignment
Run Code Online (Sandbox Code Playgroud)

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


关于private部件:功能操纵private构件a_属于同一类,所以他们被允许访问该对象的内部结构。如果这不是真的,移动(>= C++11) 并且std::unique_ptr将无法实现。