位置:首頁 > 高級語言 > C++教學 > C++重載(操作符和函數)

C++重載(操作符和函數)

C++允許指定定義一個以上的函數名稱或操作符在相同的範圍,這是所謂函數重載和運算符重載操作。

重載聲明是,已被聲明使用相同的名稱在同一範圍內,但聲明都有使用不同的參數,明顯不同的定義(實現)。

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

C++函數重載:

可以在同一範圍內的同一函數名多個定義。函數的定義必須由類型和/或參數列表參數的數目彼此不同。不能重載函數聲明僅區彆於返回類型。

以下是與print()函數功能相同,用於打印不同的數據類型的例子:

#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;
}

讓我們編譯和運行上麵的程序,這將產生以下結果:

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

C++運算符重載:

可以重新定義或重載大部分C++提供了內置的運算符。因此,程序員可以使用使用用戶定義類型運算符也是如此。

重載運算符使用特殊名稱關鍵字操作之後的操作符號被定義的函數。就像任何其他函數,重載操作符返回類型和參數列表。

Box operator+(const Box&);

聲明可用於添加兩個框對象並返回最終框對象的加法運算符。大多數重載操作符可以定義為普通非成員函數或類成員函數。如果我們定義上麵的函數作為類的非成員函數,那麼我們就必須通過兩個參數為每個操作數如下:

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

以下是對例如使用成員函數來顯示運算符的重載的概念。在這裡,一個對象作為參數傳遞,其屬性將使用這個對象,它會調用這個操作符的對象訪問可以使用該操作符解釋如下訪問:

#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;
}

讓我們編譯和運行上麵的程序,這將產生以下結果:

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

重載/非重載運運符:

以下是可以重載運算符的列表:

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

以下是運算符的列表,這些運算符是不能被重載:

:: .* . ?:

操作符重載的例子:

這裡有各種操作符重載的例子,以幫助理解的概念。

S.N. 運算符和示例
1 一元運算符重載
2 二元運算符重載
3 關係運算符重載
4 輸入/輸出運算符重載
5 ++和 -- 運算符重載
6 賦值運算符重載
7 函數call () 操作符重載
8 下標[]運算符重載
9 類成員訪問操作符->重載