1. 程式人生 > >等號操作符重載為什麽不能用友元函數大揭秘,以及函數沒有等到重載的時候賦值會出現什麽現象(盲點)

等號操作符重載為什麽不能用友元函數大揭秘,以及函數沒有等到重載的時候賦值會出現什麽現象(盲點)

style 報錯 round 賦值運算符重載 -c post body opera 為什麽

  • 先看下面程序結果輸出什麽?
  •  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 }

運行結果:技術分享圖片

這裏類中有等號操作符重載,所以會直接調用這個。

如果用友元函數重載等號操作符的時候,程序會調用參數構造函數的,這樣會出錯

等號操作符重載為什麽不能用友元函數大揭秘,以及函數沒有等到重載的時候賦值會出現什麽現象(盲點)