重載

2018-08-12 22:03 更新

重載

C++ 允許在同一范圍內對一個函數(shù)名或一個操作符指定多個定義,分別被稱為函數(shù)重載和操作符重載。

重載聲明是在同一的范圍內對先前已經(jīng)聲明的相同函數(shù)名的聲明,除非這兩個聲明有不同的參數(shù)和明顯不同的定義(實現(xiàn)方式)。

當你調用一個重載的函數(shù)或操作符時,編譯器通過比較用來調用函數(shù)或操作符的指定的參數(shù)類型來確定使用最合適的定義。選擇最合適的重載函數(shù)或操作符的過程被稱為重載決議。

C++ 中的函數(shù)重載

你可以在同一范圍內對同一函數(shù)名有多個定義。函數(shù)的定義必須滿足參數(shù)類型不同或參數(shù)的數(shù)量不同或兩者都不相同。你不能重載只有返回類型不同的函數(shù)聲明。

下面是一個相同的函數(shù) print() 函數(shù)被用來打印不同的數(shù)據(jù)類型的例子:

    #include <iostream>
    using namespace std;

    class printData 
    {
       public:
      void print(int i) {
    cout << "Printing int: " << i << endl;
      }

      void print(double  f) {
    cout << "Printing float: " << f << endl;
      }

      void print(char* c) {
    cout << "Printing character: " << c << endl;
      }
    };

    int main(void)
    {
       printData pd;

       // Call print to print integer
       pd.print(5);
       // Call print to print float
       pd.print(500.263);
       // Call print to print character
       pd.print("Hello C++");

       return 0;
    }

上面的代碼編譯和執(zhí)行時,它產(chǎn)生以下結果:

    Printing int: 5
    Printing float: 500.263
    Printing character: Hello C++

 

C++ 中的運算符重載 

你可以重新定義或重載的大部分 C++ 已有的操作符。因此,程序員可以像使用用戶自定義類型一樣使用操作符?!?/p>

重載操作符是一類函數(shù),它們就是對已有的運算符重新進行定義,賦予其另一種功能,以適應不同的數(shù)據(jù)類型。像任何其它函數(shù),重載運算符也有返回類型和參數(shù)列表。

    Box operator+(const Box&);

聲明加法運算符可以用來使兩個 Box 對象相加并返回最終 Box 對象。大多數(shù)重載運算符可以被定義為普通非成員函數(shù)或類成員函數(shù)。如果我們把上面的函數(shù)定義為一個類的非成員函數(shù),那么我們就必須為每個操作數(shù)傳兩個參數(shù)如下:

    Box operator+(const Box&, const Box&);

下面是通過使用成員函數(shù)來展示運算符重載的概念的示例。這里一個對象作為一個參數(shù)被傳遞,通過訪問這個對象可以獲得參數(shù)的屬性,將調用這個操作符的對象可以通過使用 this 操作符獲得,下面這個例子展示了這一點:

    #include <iostream>
    using namespace std;

    class Box
    {
       public:

      double getVolume(void)
      {
     return length * breadth * height;
      }
      void setLength( double len )
      {
      length = len;
      }

      void setBreadth( double bre )
      {
      breadth = bre;
      }

      void setHeight( double hei )
      {
      height = hei;
      }
      // Overload + operator to add two Box objects.
      Box operator+(const Box& b)
      {
     Box box;
     box.length = this->length + b.length;
     box.breadth = this->breadth + b.breadth;
     box.height = this->height + b.height;
     return box;
      }
       private:
      double length;  // Length of a box
      double breadth; // Breadth of a box
      double height;  // Height of a box
    };
    // Main function for the program
    int main( )
    {
       Box Box1;// Declare Box1 of type Box
       Box Box2;// Declare Box2 of type Box
       Box Box3;// Declare Box3 of type Box
       double volume = 0.0; // Store the volume of a box here

       // box 1 specification
       Box1.setLength(6.0); 
       Box1.setBreadth(7.0); 
       Box1.setHeight(5.0);

       // box 2 specification
       Box2.setLength(12.0); 
       Box2.setBreadth(13.0); 
       Box2.setHeight(10.0);

       // volume of box 1
       volume = Box1.getVolume();
       cout << "Volume of Box1 : " << volume <<endl;

       // volume of box 2
       volume = Box2.getVolume();
       cout << "Volume of Box2 : " << volume <<endl;

       // Add two object as follows:
       Box3 = Box1 + Box2;

       // volume of box 3
       volume = Box3.getVolume();
       cout << "Volume of Box3 : " << volume <<endl;

       return 0;
    }

上面的代碼編譯和執(zhí)行時,它產(chǎn)生以下結果:

    Volume of Box1 : 210
    Volume of Box2 : 1560
    Volume of Box3 : 5400

可重載/不可重載的運算符

下面這張表列舉了可以重載的運算符:

+ - * / % ^
& | ~ ! , =
< > <= >= ++ --
<< >> == != && ||
+= -= /= %= ^= &=
|= *= <<= >>= [ ] ()
-> ->* new new[ ] delete delete[ ]

下面這張表列舉了不可以重載的運算符:

:: .* . ?:

運算符重載例子

這里有各種操作符重載的例子來幫助你理解這一概念。

序號 運算符和例子
1 一元運算符重載
2 二元運算符重載
3 關系運算符重載
4 輸入/輸出運算符重載
5 ++ 和 -- 運算符重載
6 賦值運算符重載
7 函數(shù) call() 運算符重載
8 下標[ ]運算符重載
9 類成員獲取運算符 -< 重載
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號