我举了以下例子来说明我的问题:
// 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_
似乎无法访问它。有任何想法吗?谢谢。
答案 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 ++保护是在类级别而不是在实例级别。所以问题在于你所在的方法与实例无关。