我的隨行筆記9 C++ Primer Plus

qwer1030274531發表於2020-09-01

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


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


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


district=sid.operator+(sara);


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


假設Time類 class Time{ privates: int hours; int minutes;  public: ...........};


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){


os<<t,hours<<"hours, "<<t.minutes<<" minutes."; } //cout是ostream類的物件,透過os引用cout物件。應該引用cout本身,而                        //不 是它的複製,該函式按引用(而不是按值)來傳遞引數。當建立的一個新的物件被返回時,不應該用引用返回。


當trip是Time的物件時,可以使用cout<<trip;  輸出4 hours, 25 minutes


(2)使用友元函式第二種,這種也可以用於輸出寫入檔案中


ostream & operator<<(ostream &os, const Time &t){  //與第一種相比,有返回型別ostream &


os<<t,hours<<"hours, "<<t.minutes<<" minutes.";


return os; }


可以實現:cout<<"Trip time: "<<trip<<" (Tuesday)\n";


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

private: 

  enum {Lbs_per_stn=14};

  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() {return int (pounds+0.5); }  呼叫語句:  int plb=walls;


替換為:


int  Stonewt::Stone_to_Int()  {return int (pounds+0.5); }


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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2716230/,如需轉載,請註明出處,否則將追究法律責任。

相關文章