C Primer Plus 第十一章

2021-06-22 11:28:56 字數 3112 閱讀 7178

//操作符過載

只能過載現有的操作符

操作符過載其實一種函式替換:如

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...