我举以下例子来说明我的问题:
// 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_似乎可以正常工作时不应访问它。有任何想法吗?谢谢。
您需要区分初始化和分配。
是的,初始化是定义变量时的初始化;你设置它的初始值。例子:
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将无法实现。