有關C 中類加法的兩種方式

2021-10-21 23:23:44 字數 3126 閱讀 5034

眾所周知,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...