在前一節中曾提到過,c++中執行時的多型性主要是通過虛函式來實現的,而編譯時的多型性是由函式過載和運算子過載來實現的。這一系列我將主要講解c++中有關運算子過載方面的內容。在每乙個系列講解之前,都會有它的一些基礎知識需要我們去理解。而運算子過載的基礎就是運算子過載函式。所以今天主要講的是運算子過載函式。
1.運算子過載是對已有的運算子賦予多重含義,使同乙個運算子作用域不同型別的資料導致不同行為的發生。比如
1假如我們建立兩個複數,並用"+"運算子讓它們直接相加:int i;
2int i1=10,i2=10;
3 i=i1+i2;
4 std::cout<
i1+i2=
"<5
6double d;
7double d1=20,d2=20;
8 d=d1+d2;
9 std::cout<
d1+d2=
"<
在這個程式裡"+"既完成兩個整形數的加法運算,又完成了雙精度型的加法運算。為什麼同乙個運算子"+"可以用於完成不同型別的資料的加法運算?這是因為c++針對預定義基本資料型別已經對"+"運算子做了適當的過載。在編譯程式編譯不同型別資料的加法表示式時,會自動呼叫相應型別的加法運算子過載函式。但是c++中所提供的預定義的基本資料型別畢竟是有限的,在解決一些實際的問題時,往往需要使用者自定義資料型別。比如高中數學裡所提到的複數:
1class complex //
複數類2
11 }
1 complex com1(10,10),com2(20,20),sum;那麼會提示沒有與這些運算元匹配的 "+" 運算子的錯誤。這是因為complex類型別不是預定義型別,系統沒用對該型別的資料進行加法運算子函式的過載。c++就為運算子過載提供了一種方法,即運算子過載函式。其函式名字規定為operator後緊跟過載運算子。比如:operator+(),operator*()等。現在我們給上述程式宣告乙個加法運算子的過載函式用於完成複數的加法運算:2 sum=com1+com2;
1 #include "stdafx.h
"2 #include 34
class complex //
複數類5
14 };
1516 complex operator+(complex com1,complex com2)//
運算子過載函式
17 20
21int main()
22 {
23 complex com1(10,10),com2(20,20),sum;
24 sum=com1+com2;//
或sum=operator+(com1,com2)
2526 std::cout<
sum的實數部分為
"<27
C 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
C 運算子過載轉換運算子
為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...