C Primer Plus 隨記(第十一章)

2021-09-08 05:46:54 字數 2578 閱讀 5371

1. operator+() :過載+運算子 operator* ():過載*運算子  使得可以直接對類類物件進行+ 或 * 操作

假設 district, sid, sara 是類salaperson的物件,可編寫:

district=sid+sara;// 等價於下一句 ,這兩個都呼叫operator+()方法,sid是呼叫物件,sara作為引數被傳遞的物件。

district=sid.operator+(sara);

2.過載運算子不必是成員函式,但必須至少有乙個運算元是使用者定義的型別。(有些運算子只能通過成員函式過載  = 、() [ ] ->)

假設time類 class time;

3.友元:友元函式,友元類,友元成員函式。可以訪問類的私有資料

(要實現加法或乘法的交換律,必須用友元函式過載加法或乘法。)

4.(1)建立友元函式原型放在類宣告中但它不是成員函式,並在宣告前加關鍵字friend

friend time operator* (double m,const time & t); //返回值是time類

//雖然放在類宣告中,但它不是成員函式,不能使用成員運算子句點.來呼叫,但與成員函式有相同的許可權

(2)定義友元函式:不用類限定符::,定義時不加關鍵字friend

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

5.如果要為類過載運算子,並將非類的項作為其的第一運算元,則可以用友元函式來反轉運算元順序

6.過載《運算子:

(1)使用友元函式第一種:

void operator<<(ostream &os, const time &t)

可以實現:cout<<"trip time: "<7. 當成員函式或友元函式的**很短時,可以將宣告和定義同時進行,寫在類宣告中,這樣函式變成了內聯函式。

8 對很多運算子,可以選擇使用成員函式或非成員函式來實現運算的過載。如:

time operator+(const time &t) const; //成員函式

friend time operator+( const time &t1, const time &t2 ); //非成員函式 

8.在命名空間vector中定義了類vector的成員函式和友元函式時,友元函式要使用類中常量rec時, vector::rec

外部宣告物件時vector folly(20 ,30 , vector::vector::rec);

9. 類的自動轉換:只有接受乙個引數的建構函式才能作為轉換函式。

class stonewt

;  int stone;

double pds_left;

double pounds;

public:

stonewt(double lbs);

stonewt(int stn,double lbs);

stonewt();

~stonewt();

};

(1)將int型別轉換為類stonewt型別:(只有乙個引數的類建構函式用於將型別與該引數相同的值轉換為類型別

stonewt  wall=325.25; //用stonewt(double)來設定全部3個成員,將double型別賦值給類物件,轉換為類型別

stonewt  taft=325; //int先轉換為double,再用stonewt(double)來設定全部3個成員。

(2)將類型別轉化到其他型別:需要轉換函式,即有使用者定義的強制型別轉換。轉換函式是類成員,無返回型別,無引數,名為 operator typename(),其中typename為物件將被轉換成的型別。

stonewt wolfe(285.7);

double host=double (wolfe); //#1  or    double host=(double)  wolfe; //#2

要實現#1和#2,需要在類的方法中宣告 轉換為double型別的函式原型:operator double() const; //轉換函式

stonewt walls(20,3);

double star=walls; // 右側是類型別,左側是double,編譯器將先檢視是否有匹配的轉換函式,有則隱式呼叫編譯成功,無則出錯

不需要編譯器自動尋找匹配的編譯函式來自動轉換 ,可以用關鍵字explicit來強制轉換:

explicit operator int() const;  //僅被顯示呼叫

10. 轉換函式可以用非轉換函式來替換:

stonewt::operator int()   呼叫語句:  int plb=walls;

替換為:

int  stonewt::stone_to_int() 

則呼叫語句為: int plb=walls.stone_to_int();

C Primer Plus學習隨記(五)

5.1 for迴圈 forloop.cpp introducing the for loop include int main 5.1.1 for迴圈的組成部分 1.設定初始值。2.執行測試,看看迴圈是否應當繼續進行。3.執行迴圈操作。4.更新用於測試的值。for initialization te...

C Primer Plus 第十章 陣列和指標

int sum int ar,int n intsum int int intsum int ar,int n intsum int int 指標減去乙個整數 指標必須是第乙個運算物件 相加的逆操作。遞減指標 逆操作遞增 指標求差 可以計算兩個指標的差值。通常,求差的兩個指標分別指向同乙個陣列的不同...

C Primer Plus 第十章 物件和類

class stock stock stock const string co,int num 1.顯式地呼叫建構函式 stock food stock world cabbage 250 2.隱式地呼叫建構函式 stock garment furry mason 50 stock stock1 s...