C++學習筆記(九)
操作符過載、友元函式、類的強制轉換
1.將某個函式改為過載操作符的函式只要將函式名替換為operator+()即可
如:Time Sum(const Time & t)const
改為Time operator+(const Time & t)const
呼叫時可以如 total = coding.operator+(fixing); //coding是Time類的一個物件
也可以呼叫如: total = coding+fixing;
兩種方法都將呼叫operator+()方法,其中,操作符左側的物件時呼叫物件,右側的物件時作為引數被傳遞的物件。
因此t4 = t1 + t2 + t3 會被轉化為 t4= t1.operator+(t2.operator+(t3)};
當被過載的操作符為非成員過載操作符時,應使用非成員函式進行過載,例如:
A = 2.75*B //此種由於2.75為double,因此不是類成員,從而不能用成員函式過載後的操作符進行呼叫。
它與下面的非成員函式呼叫匹配:
A= operator*(2.75,B); //等價於Time operator *(double m,const Time & t);
非成員函式過載時,操作符表示式左邊的運算元對應於操作符函式的第一個引數,操作符表示式右邊的運算元對應第二個引數。
2.非成員函式訪問類的私有成員時可以藉助友元,即能訪問類的私有成員的非成員函式叫做友元函式。
友元函式宣告中帶friend但定義中不帶,且友元函式前不能加類的限定符,因為是非成員函式
3.一種<<操作符的過載(使用cout<<...直接輸出物件內容)
(1) void operator<<(ostream &os,const Time &t) //Time類有兩個成員變數hours和minutes
{
os<<t.hours<<"hours."<<t.minutes<<"minutes";
}
(2)為了支援操作cout<<A<<B; 這種連續輸出,左側表示式(cout<<A)應返回一個ostream型別物件以此來呼叫下一次的輸出操作。此時由於程式傳入的引數是一個物件的引用,因此返回引數時應返回該物件的引用,即返回為ostream &型。如下:
ostream & operator<<(ostream &os,const Time &t)
{
os<<...;
return os; //該種過載還可以用於檔案fou<<的過載(直接輸出某檔案)
}
4.只接受一個引數的建構函式可以用於將引數轉換為類型別,這種是種隱式轉換,如:
定義時:Stonewt::Stonewt(double lbs)
{
stone = int(lbs) / x; //對double進行操作,建構函式返回Stonewt的類型別
...
}
呼叫時:
Stonewt myCat;
myCat =19.6; //隱式轉換
如果在定義時使用關鍵字explicit,可以避免這種隱式轉換,如: explicit Stonewt(double lbs);
在用explicit限定完之後,如果想呼叫轉換,則只能對它進行限制呼叫,如mycat=(Stonewt)19.6; //強制轉換屬於顯示呼叫
5.如果希望將類轉化為已有型別,如int或double,需要建立轉換函式,比如要轉換為typeName型別,則要用如下形式:
operator typename();
比如講某個類轉化為Int型,則要將如下語句新增到類中:
class Stonewt
{
...
operator int(); //也可以在後面加上const 限定符修飾
}
呼叫時直接 cout<<int(poppins)<<endl; //此時假定poppins是Stonewt的一個物件