眾所周知,c++允許使用操作符過載,從而使類與類、類與常量直接相加,簡化寫法。
而操作符過載跟使用的順序有關,並不是那麼簡單的,比如a是乙個類,如果你只定義了成員操作符過載函式,則寫成a+1沒有問題,寫成1+a就會報錯了,這個問題有兩種解決方式:
假設我們定義了乙個complex類
class
complex
//構造轉換函式..
....
..}
那麼如果有類的構造轉換函式,就可以支援這種寫法
complex a;a=2
;
注意,這裡先呼叫構造轉換函式,隱式地將2轉換為了complex類,然後再拷貝給a。
要進行這種隱式的轉換是有條件的:
要麼構造轉換函式只有乙個引數。
complex
(int n)
要麼有多個引數,但從第二個開始給每個引數設定預設值
complex
(int n,
int a=1,
int b=2,
....
..)
總之,這種隱式的轉換看似方便,但也會帶來很多問題,所以c++提供了explicit關鍵字用來關閉這種隱式轉換:
explicit
complex
(int n)
這樣寫,就只能顯式的呼叫了
a=
complex(2
);
接下來回歸主題,有了這種構造轉換函式,就可以輕鬆實現類與基本型別的相加,只要再定義乙個友元類的操作符過載函式:
class
complex
}private
:int rel;
//實部
int img;
//虛部
public
:complex
(int n)
:rel
(n),
img(0)
//構造轉換函式
friend complex operator+(
const complex&
,const complex&);
....
....
}
這樣,不論是寫成a+2還是2+a,編譯器都先通過隱式轉換寫成兩個complex類,然後呼叫operator+()。
這種方式就很簡單了,可以這樣寫:
class
complex
}private
:int rel;
//實部
int img;
//虛部
public
: complex operator+(
int)
;//函式1
friend complex operator+(
int,
const complex&);
//函式2..
....
..}
當寫成a+1時,呼叫成員函式1,當寫成1+a時,調用友元函式2。
最後來看乙個例項:
#include
using
namespace std;
class
complex
complex
(int a,
int b)
:rel
(a),
img(b)
complex
(int);
//構造轉換函式
public
:friend complex operator+(
const complex&
,const complex&);
friend complex operator-(
const complex&
,const complex&);
complex operator*(
const complex&);
friend complex operator*(
int,
const complex&);
public
:friend ostream&
operator
<<
(ostream&
,const complex&);
};complex::
complex
(int n)
//函式1 構造轉換函式
complex operator+(
const complex& one,
const complex& two)
//函式2 友元操作符過載函式
complex operator-(
const complex& one,
const complex& two)
//函式3 同上
complex complex::
operator*(
const complex& one)
//函式4 成員操作符過載函式
complex operator*(
int n,
const complex& one)
//函式5 友元操作符過載函式
ostream&
operator
<<
(ostream& os,
const complex& one)
else
return os;
}int
main()
輸出結果:
呼叫了函式1呼叫了函式2
5+2i
呼叫了函式1
呼叫了函式3
-2i呼叫了函式1
呼叫了函式4
6+4i
呼叫了函式5
20-8i
呼叫了函式4
19+4i
呼叫了函式2
8呼叫了函式3
-2+4i
C 中 include的兩種方式
一 include include 引用的是編譯器的類庫路徑裡面的標頭檔案。假如你編譯器定義的自帶標頭檔案引用在 c keil c51 inc 下面,則 include引用的就是 c keil c51 inc stdio.h 這個標頭檔案,不管你的專案在什麼目錄裡,c keil c51 inc st...
類的兩種引入方式
一種是通過 import方式引入 另一種是通過 class引入 這兩種的方式的區別在於 1 import方式會包含被引用類的所有資訊,包括被引用類的變數和方法 class方式只是告訴編譯器在a.h檔案中 b b 只是類的宣告,具體這個類裡有什麼資訊,這裡不需要知道,等實現檔案中真正要用到時,才會真正...
C 中呼叫cmd兩種方式
兩種方式各有優缺,第一種方式不用exit,返回值中比較好處理,第二種方式對長 多 雜的命令支援比第一種好。在實際程式設計中根據具體的情況合理的選用,增加程式設計效率。第一種 public static string runcmd string command 第二種 public static st...