//操作符過載
只能過載現有的操作符
操作符過載其實一種函式替換:如
district2 = sid + sara;
district2 = sid.operator()+(sara); //隱式轉換
ex:mytime.h
class time
;mytime.cpp
time time::operator+(const time &t) const
於是:time t,t1,t2;
可以用下列方式呼叫
t = t1 + 2; <-----> t = t1.operator+(t2);
//過載限制
1 過載後的操作符必須至少有乙個運算元是使用者定義的型別,這將防止使用者為標準型別過載操作符。(例如,不能將減法操作符過載為兩個double值的和)
2 過載後的操作符不能違反操作符原來的句法規則,例如,不能將求模操作符% 過載成使用乙個運算元(原來的求模操作符需要兩個運算元)
3 過載後的操作符優先順序不變
4 不能定義新的操作符
5 不能過載下面的操作符
sizeof()..*
::?:
typeid rtti操作符
const_cast
dynamic_cast
reinterpert_cast
static_cast
6 操作符過載可以通過成員函式(類函式)或普通函式過載,但下面的操作符只能通過成員函式過載
= 賦值操作符
() 函式呼叫操作符
下標操作符
-> 通過指標訪問類成員的操作符
//友元
友元有三種:
1 友元函式
2 友元類
3 友元成員函式
通過讓函式成為類的友元,可以賦予該函式與類成員函式相同的訪問許可權
友元的用處
time a,b
a = b*2.5; //因為過載了 *所以,a=b*2.5 --> a.operator*(2.5)
a = 2.5*b; //編譯器無法過載
但是,通過編寫普通函式過載--> time operator*(double m, const time &t)
a = 2.5*b //a = 2.5*b --> operator*(2.5, b),但是,這樣無法獲取time的私有成員(用友元解決)
加入友元函式
class time
;友元函式不是time類的成員函式,所以不加 time:: 網域名稱限定符
time operator*(double m, const time &t)
常用的友元:過載《操作符,注意返回ostream以便實現 os << a << b 的效果
ostream& operator<< (ostream &os, const time &t)
note:friend關鍵字在類成員函式的定義中使用
note:如果你同時定義了相同呼叫格式的 類成員函式與非類成員函式,會導致編譯錯誤
//類的自動轉換盒強制轉換
c++不自動轉換不相容型別
int *p = 10; //type clash wrong!
int *p = (int *) 10 //right
自動轉換建構函式
stonewt(double lbs);
stonewt mycat;
mycate = 19.6; //將會自動呼叫stonewt(double lbs)建立乙個物件,並將其內容複製到mycat中
等價的stonewet mycat = 260; <---> stonewet mycat(260); <---> stonewet mycat = stonewt(260);
explicit stonewt(double lbs); //關閉這種自動特性的隱式轉換,不過仍可使用顯式轉換,如下:
mycate = (stonewt)19.6; //顯式轉換
隱式轉換發生在如下場景:
1 將stonewet初始化為double值時
2 將double值複製給stonewet物件時
3 將double值傳值給接受stonewet引數的函式時
4 返回值宣告為乙個stonewet的函式,返回乙個都變了時
還可以進行如下轉換:
stonewet jumbo;
jumbo = 7300; //將7300的int型轉換為double型,注意如果還有建構函式stonewet jumbo(long) 則因為int既可以轉換為long,也可轉換為double,因此呼叫存在歧義,編譯錯
//轉換函式
使用轉換函式將類型別轉換為元型別(int ,double...)
轉換函式如下宣告
operator typename();
stonewet
stonewet::operator int();
要注意以下幾點:
1 轉換函式必須是類方法
2 轉換函式不能指定轉換型別 //即連void都沒有,但是卻可以返回引數
3 轉換函式不能有引數
//轉換函式的缺點!如:
int ar[20];
...stonewet temp(14,4);
...int temp = 1;
...cout << ar[tmep] << endl; //這裡的類型別temp將會轉換為int值,編譯器不會報錯
轉換總結:
1 只有乙個引數的類建構函式會轉換,可以用explicit防止隱式轉換
2 operator int();可以將類型別轉換為int型
兩種轉換函式可能會混亂!
total = stoenwet1 + stonewet2;
可能的轉換
1. stoenwet1.operator+(stonewet2);
2. operator+(stoenwet1, stonewet2);
3. 轉換成double加法 //因為stonewet有double建構函式,且定義了operator double()
//1,2會編譯錯;1,3 2,3則會混亂 vs會選擇1,2
C Primer Plus 隨記(第十一章)
1.operator 過載 運算子 operator 過載 運算子 使得可以直接對類類物件進行 或 操作 假設 district,sid,sara 是類salaperson的物件,可編寫 district sid sara 等價於下一句 這兩個都呼叫operator 方法,sid是呼叫物件,sara...
modern c design 第十一章
本章介紹了經常遇到的雙分派的一種泛型解決方案。c 在語法上實現了單分派,即虛函式,通過動態機制選擇相應的函式。雙分派是形如fun object1 a,object2 b 根據a和b的實際型別動態自動分派乙個處理函式。最容易想到的方案,蠻幹法 寫一大堆過載函式.不過這種方法會有很強的依賴性。也提供了一...
第十一章3
第十一章 一 滾動元件 awt中的滾動元件包括scrollbar 滾動條 和滾動面板 scrollpane 兩種。1 滾動條scrollbar 在指定的取值範圍內快速選取某一值的功能。i.構造方法 public scrollbar int orientation,int value,int visi...