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

Posted 菜鸟根据地

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了等号操作符重载为什么不能用友元函数大揭秘,以及函数没有等到重载的时候赋值会出现什么现象(盲点)相关的知识,希望对你有一定的参考价值。

 

 

 

 

 

  • 先看下面程序结果输出什么?
  •  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 ; //这里会直接等号操作符,按照上面的道理,这里调用的是无参构造函数呢

 

以上是关于等号操作符重载为什么不能用友元函数大揭秘,以及函数没有等到重载的时候赋值会出现什么现象(盲点)的主要内容,如果未能解决你的问题,请参考以下文章

什么运算符一定要重载友元函数,什么时候一定要重载为成员函数?

操作符(运算符)重载注意事项(含模板类中<<;;重载)

c++知识点总结--友元&运算符重载

09. 友元,引用计数

09. 友元,引用计数

C++入门不能重载为友元函数的4个运算符(=, ->, [ ], ( ))