1. 程式人生 > >C++學習筆記(九)

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的一個物件