C++ C++;重载赋值运算符在不相关的类中被调用

C++ C++;重载赋值运算符在不相关的类中被调用,c++,operator-overloading,C++,Operator Overloading,在下面的代码中,我无法理解为什么类A的重载赋值运算符被调用用于类B的赋值,因为这些类不相关(继承) A类{ 公众: 无效运算符=(常数A和rhs){ 如果(此==&rhs)cout如果未提供赋值运算符,编译器将自动生成一个对类的每个成员执行赋值的运算符。在此自动生成的赋值运算符中,将调用A的赋值运算符重载。如果未提供赋值运算符,编译器将自动生成o对类的每个成员执行赋值的ne。在此自动生成的赋值运算符中,将调用A赋值运算符的重载。它是为您声明的A成员变量调用的。您正在复制对象(到同一对象中)因此,

在下面的代码中,我无法理解为什么类A的重载赋值运算符被调用用于类B的赋值,因为这些类不相关(继承)

A类{
公众:
无效运算符=(常数A和rhs){

如果(此==&rhs)cout如果未提供赋值运算符,编译器将自动生成一个对类的每个成员执行赋值的运算符。在此自动生成的赋值运算符中,将调用
A
的赋值运算符重载。

如果未提供赋值运算符,编译器将自动生成o对类的每个成员执行赋值的ne。在此自动生成的赋值运算符中,将调用
A
赋值运算符的重载。

它是为您声明的A成员变量调用的。您正在复制对象(到同一对象中)因此,默认赋值运算符将复制每个成员变量

此运算符(编译器生成)以递归方式复制每个成员。它通过调用实例中每个字段上的复制构造函数以及创建副本的对象中的相应字段来工作


另请看一看它是为您声明的成员变量调用的。您正在复制对象(到同一个对象中),因此每个成员变量都是由默认赋值运算符复制的

此运算符(编译器生成)以递归方式复制每个成员。它通过调用实例中每个字段上的复制构造函数以及创建副本的对象中的相应字段来工作


另请看

,因为
B
有一个
a
,并且编译器生成的赋值运算符做了正确的事情。“因为这些类不相关(继承)”-它们是相关的,称为组合。因为
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
}