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, 那我就不會和這錯誤在次相遇. 塞翁失馬-焉知非福.
打開今日頭條,查看更多精彩圖片


※jQuery源碼分析之jQuery.event.fix方法五問
※MyBatis源碼解讀之延遲載入 頂
TAG:程序員小新人學習 |