天天看點

c++primer plus 6 讀書筆記 第十一章 使用類

目錄

​​11 使用類​​

​​11.1 運算符重載​​

​​11.2 計算時間:一個運算符重載示例​​

​​11.2.1 添加加法運算符。使用operator+ 函數。​​

​​11.2.2 重載限制。​​

​​11.2.3​​

​​11.3友元​​

​​11.3.1 建立友元​​

​​11.3.2 常用的友元:重載<<運算符​​

​​11.4 重載運算符:作為成員函數函數非成員函數​​

​​11.5 再談重載:一個矢量類​​

​​11.6 類的自動轉換和強制類型轉換​​

​​11.6.1 轉換函數(将類轉換成int/double等)​​

​​11.6.2 轉換函數和友元函數。​​

11 使用類

11.1 運算符重載

C++允許運算符重載擴充到使用者定義的類型。

重載運算符使用運算符函數。

運算符函數格式如下:

operatorop(argument-list)

E:

Time operator+(const Time &t)const; //重載+運算符。

11.2 計算時間:一個運算符重載示例

11.2.1 添加加法運算符。使用operator+ 函數。

運算符左側是調用對象,右側是參數(被傳遞的對象)。

11.2.2 重載限制。

1.重載後的操作符至少有一個操作數是使用者自定義類型。

2.不能違反運算符原來的運算規則。

3.不能建立新的運算符

4.不能重載某些特殊運算符

如:

sizeof , . , .* , :: , ?: , ...(其餘的略去,因為很少見到)

  1. 大多數運算符都可以通過成員函數或者非成員函數進行重載,但是一下運算符隻能通過成員函數進行重載。

= , () , [] , -> ,

11.2.3

11.3友元

通常,公有類方法提供唯一的通路類對象的私有部分(private)的通路,但是有時這種限制太嚴格。

C++提供另一種形式的通路權限:友元。

友元有三種:

友元函數;

友元類;

友員成員函數。

11.3.1 建立友元

1.将其原型放在類聲明中,并且在原型聲明前加上關鍵字friend:

friend Time operator*(double m, const Time &t);

這使得非成員函數operator*()和成員函數的通路權限相同。

2.編寫函數定義

它不是成員函數,不使用Time::限定,也不要在定義中使用friend,定義如下:

Time operator*(double m, const Time & t)

{

Time result;

long totalminutes = (t.hours * 60 + t.minutes)*mult;

result.hours = totalminutes / 60;

result.minutes = totalminutes % 60;

return result;

}

11.3.2 常用的友元:重載<<運算符

11.4 重載運算符:作為成員函數函數非成員函數

兩者選一個,有時成員函數是唯一選擇。

通常沒有太大差別。

11.5 再談重載:一個矢量類

11.6 類的自動轉換和強制類型轉換

構造函數用作自動(隐式)類型轉換函數,(double/int等轉換成類)

關鍵字explicit用于關閉這種特性。

11.6.1 轉換函數(将類轉換成int/double等)

建立轉換函數:

operator typeName();

要求:

轉換函數必須是類方法;不能指定傳回類型;不能有參數;

例子:

operator double();

11.6.2 轉換函數和友元函數。