等号操作符重载为什么不能用友元函数大揭秘,以及函数没有等到重载的时候赋值会出现什么现象(盲点)

  • 先看下面程序结果输出什么?
  •  1 #include <iostream>
     2 using namespace std;
     3 
     4 class A
     5 {
     6 private:
     7     int x;
     8 public:
     9     A(){
    10         x=99;
    11         cout<<"看看这里是否会被调用"<<endl;
    12     }
    13 };
    14 
    15 int main()
    16 {
    17     A a;
    18     a = 7;
    19 }

    这里面,会报错,显示没有等号匹配现象。只有无参构造函数,函数类型的对象赋值会报错



  •  
    •  
    •  
    •   
  • 接下来是有无参构造函数和有参构造函数的类
  • #include <iostream>
    using namespace std;
    
    class A
    {
    private:
        int x;
    public:
        A(){
            x=99;
            cout<<"看看这里是否会被调用"<<endl;
        }
        A(int xx)
        {
            cout<<"Call A(int xx)"<<endl;
            x = xx;
        }
    
    };
    
    int main()
    {
        A a;
        a = 7;
    }

    运行结果为:

  •  

  • 这里可以理解为当类中没有定义等号赋值运算符重载的时候,类对象的赋值会调用相对应的参数构造函数

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class A
 5 {
 6 private:
 7     int x;
 8 public:
 9     A(){
10         x=99;
11         cout<<"看看这里是否会被调用"<<endl;
12     }
13     A(int xx)
14     {
15         cout<<"Call A(int xx)"<<endl;
16         x = xx;
17     }
18 
19     A operator=(int xx)   //重载赋值运算符运算
20     {
21         cout<<"Call A operator=(int xx)"<<endl;
22         x = xx;
23         return *this;
24     }
25 
26 };
27 
28 int main()
29 {
30     A a;
31     a = 7;
32 }

运行结果:

这里类中有等号操作符重载,所以会直接调用这个。

如果用友元函数重载等号操作符的时候,程序会调用参数构造函数的,这样会出错

A a;

A b;

a = b ; //这里会直接等号操作符,按照上面的道理,这里调用的是无参构造函数呢

原文地址:https://www.cnblogs.com/xiaochige/p/8645297.html