C 類的操作符過載 型別轉換

2021-08-21 19:29:38 字數 1694 閱讀 2347

這裡總結一下c++裡面類的操作符的過載以及型別轉換的定義,作為對c++ primer plus第11章的總結。

通過操作符過載,可以直接定義兩個型別之間的操作符(加減乘除等)。乙個例子是:

class

vector

};vector a,b;

vector c = a+b; // 在vector上使用加法運算子

操作符過載有兩種實現方式:成員函式和非成員函式。

將操作符過載函式作為類的成員宣告並定義,如上面的例子,對於兩個vector的加法,會被解釋為:a.operator+(b);

如果操作符是個單目運算子,那麼可以在成員函式定義中直接把參數列不寫。例如:

vector operator!();

成員函式操作符過載方法有乙個顯著的缺點:假設操作符是乙個二元運算子,操作符左邊的值是乙個基本型別,那麼這種方法就無法定義需要的操作符過載。例如:

class vector;

int integer;

vector a;

vector c = integer + a; //

這時候,可以考慮通過非成員函式的形式定義運算子過載。上面的需求可以這麼定義:

vector operator+(int integer, const vector &vec);

這麼定義有可能會用到vector類內的一些私有變數,然而,由於不是成員函式,這個過載後的函式是不能訪問私有變數的。解決方式是使用友元函式,將該函式設定為vector類的友元即可。

定義過載運算子,乙個需要注意的問題是二義性。例如,同時定義以下兩個函式會造成二義性:

vector vector::operator+(const vector &a);

vector operator+(const vector &a, const vector &b);

在這種定義下,vector v = vector()+vector();語句會出現二義性,即兩個定義的函式都同等程度適用於這個語句,導致編譯無法通過。因此,在定義運算子過載的時候務必注意這一點。by the way,加上下面型別轉換後,這個問題會變得更加複雜化。

c++本身支援一些自動型別轉換。例如:int c = 6.0會自動將double型的6.0轉換為int,並賦值給c。但是,對於使用者自己定義的類,編譯器並不知道如何轉換。這時候,就需要自己定義轉換建構函式/轉換函式了。

顧名思義,是一種建構函式。他的特點是,只有乙個引數。下面給乙個例子:

vector(int a)

vector c = 4; // c=(4,0)

這種語法實現了類似將int型的4自動轉換為vector的需求。在呼叫引數為vector的函式的時候,如果傳入的引數是int型,也會被自動轉換成vector型的變數傳進函式內。除此之外,還有以下幾種隱式轉換:

當然,有時候這樣做會使得型別轉換變得混亂。如果想要關閉某個轉換建構函式的自動隱式型別轉換,只需要在函式原型前加explicit就行了。在這種情況下,只有通過vector c = vector(5)這種顯式轉換的方法實現型別轉換。

可以看做是轉換建構函式的反函式。未完待續

C 過載型別轉換操作符

在需要做資料型別轉換時,一般顯式的寫法是 cpp view plain copy font size 18px type1 i type2 d i type1 d 顯式的寫型別轉,把d從type2型別轉為type1型別 這種寫法不能做到無縫轉換,也就是直接寫 i d,而不需要顯式的寫 type1 來...

型別轉換和操作符過載 c

也許你從來沒有考慮過型別轉換和操作符過載的問題,畢竟在很多時候,我們都是系統標準型別,使用內建的一些轉換函式和操作符。但是假設你經常性地需要建立自定義型別 或者結構體 同時你想為它們都實現更加豐富的效果,那麼了解.net所支援的型別轉換和操作符過載就顯得有些必要了 下面看看乙個結構體的定義 publ...

C 過載操作符與轉換

明智的使用操作符過載可以使類型別的使用像內建型別一樣直觀。過載操作符必須具有至少乙個類型別或列舉型別的運算元,這條規則強制過載操作符不能重新定義用於內建型別物件的操作符的含義。過載操作符並不保證運算元的求值順序,尤其是,不會保證內建邏輯and 邏輯or和逗號操作符的運算元求值,在 和 的過載版本中,...