在下面的代码中,我无法理解为什么要为类B的赋值调用类A的重载赋值运算符,因为这些类不相关(继承)?
class A {
public:
void operator=(const A& rhs) {
if (this == &rhs) cout << "self-assigned";
}
};
class B {
A a; // should not be a pointer member, (i.e) A* a
};
int main() {
B b;
b = b; // Ans: self-assigned
}
此外,如果在B类中实现了任何自定义赋值运算符,那么它将被优先于A类调用。
答案 0 :(得分:2)
如果您没有提供赋值运算符,则编译器会自动生成一个在每个类成员上执行赋值的运算符。在此自动生成的赋值运算符中,将调用A
的赋值运算符的重载。
答案 1 :(得分:2)
要为您声明的 a 成员变量调用它。您正在复制对象(进入同一对象),因此每个成员变量都由默认赋值运算符复制。
此运算符(编译器生成的)复制每个成员(递归)。它的工作原理是在实例中的每个字段上调用复制构造函数,并在创建副本的对象中使用相应的字段。