當前位置:
首頁 > 知識 > C++友元重載+運算符易錯點

C++友元重載+運算符易錯點

我今天晚上複習C++類的用法,在使用友元重載雙目運算符+的時候,出現了一個詭異的錯誤.百思不得其解,專門重寫一個類進行測試,最後發現了原因.猛然想起我之前也犯過這樣的錯誤,以為經典,故記之.

奉上錯誤代碼:

#include <iostream>

using namespace std;

class Complex { //一個複數類

public:

Complex () {} //無參構造

Complex (int a, int b) { //有參構造

real = a;

imag = b;

}

friend Complex operator + (int &, Complex &); //友元重載+

private:

int real, imag;

};

Complex operator + (int &a, Complex &c) //友元重載+

{

return Complex (a+c.real, c.imag);

}

int main( )

{

Complex c(1, 2);

Complex d = 1 + c; //使用重載+函數

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

這是一個簡單的Complex複數類,除構造函數外只有一個友元重載+函數.這個函數有個錯誤.

報錯是這樣的:

[Error] no match for 『operator+』 (operand types are 『int』 and 『Complex』)

大意是沒有」operator+」這個函數.我覺得很奇怪,怎麼會沒有呢?我這裡明明寫了呀.一番糾結,掙扎,終於發現右邊提示的類型:int, Complex.猛然想起此前犯過這樣的錯誤.

如何?這裡不能用引用!

也就是說,函數的形參類型應該是int而非int &,因為,對int型變數n來說:

Complex c(1, 2);

//Complex d = 1 + c; //使用重載+函數

int n = 1;

Complex d = n + c; //正確

1

2

3

4

是正確的,n可以引用,因為它是一個變數,有地址.它傳遞過去的類型可以是int, 也可以是int &.

而前面的呢?常數1是沒有地址的,所以它傳遞過去的類型只能是int, 而不能是int &.常數是沒有地址的.同const型常量.

所以,這個」詭異」的錯誤就這樣解決了.

然而,從這個錯誤中,我們能學到什麼?

首先:我在變數這一塊的基礎知識並不紮實, 在更早之前(第一次出現這樣的錯誤之前), 我並沒有多深刻地理解int與int &的區別.這讓我回想起了此前我出現過好幾次同樣」詭異」的錯誤,那就是:

double a;

int b, c;

b = 1;

c = 3;

a = b/c;

1

2

3

4

5

類似於這種形式的不同類型變數之間的運算. 此式的結果是a = 0, 因為右邊是兩個int型變數計算, 還未涉及到double, 該消的不該消的它都消了. 這個小小的錯誤曾讓我卡在一道題目上一個多小時.

其次:在這個重載函數中我為什麼要用int &呢?為什麼不直接用int ?大概是我印象中有過類似在類中某些函數一般是用引用, 而在這個函數中潛意識的收到影響了.值得反思的是:我寫這麼一個非常規類型是,並沒有明確思考我為什麼要這樣寫. 而是稀里糊塗, 腦子裡有一點印象就寫上了, 結果犯了這麼一個錯誤.不過這是好事, 遇見錯誤是好事, 倘若我從一開始就直接使用int, 那我就不會和這錯誤在次相遇. 塞翁失馬-焉知非福.

C++友元重載+運算符易錯點

打開今日頭條,查看更多精彩圖片

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

jQuery源碼分析之jQuery.event.fix方法五問
MyBatis源碼解讀之延遲載入 頂

TAG:程序員小新人學習 |