鍍金池/ 教程/ C/ 重載
動態(tài)內(nèi)存
類和對象
接口 (抽象類)
結(jié)構(gòu)體
循環(huán)的類型
函數(shù)
數(shù)字
日期和時間
基本語法
多態(tài)
數(shù)據(jù)抽象
注釋
命名空間
字符串
預(yù)處理器
決策語句
修飾符的類型
鍙橀噺綾誨瀷
基本輸入輸出
操作符
數(shù)組
模板
多線程
繼承
Web 編程
信號處理
指針
存儲類型
概述
引用
常量
異常處理
開發(fā)環(huán)境
重載
變量作用域
數(shù)據(jù)類型
數(shù)據(jù)封裝
文件和流

重載

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

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

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

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

你可以在同一范圍內(nèi)對同一函數(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)生以下結(jié)果:

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

 

C++ 中的運(yùn)算符重載 

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

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

    Box operator+(const Box&);

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

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

下面是通過使用成員函數(shù)來展示運(yùn)算符重載的概念的示例。這里一個對象作為一個參數(shù)被傳遞,通過訪問這個對象可以獲得參數(shù)的屬性,將調(diào)用這個操作符的對象可以通過使用 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)生以下結(jié)果:

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

可重載/不可重載的運(yùn)算符

下面這張表列舉了可以重載的運(yùn)算符:

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

下面這張表列舉了不可以重載的運(yùn)算符:

:: .* . ?:

運(yùn)算符重載例子

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

序號 運(yùn)算符和例子
1 一元運(yùn)算符重載
2 二元運(yùn)算符重載
3 關(guān)系運(yùn)算符重載
4 輸入/輸出運(yùn)算符重載
5 ++ 和 -- 運(yùn)算符重載
6 賦值運(yùn)算符重載
7 函數(shù) call() 運(yùn)算符重載
8 下標(biāo)[ ]運(yùn)算符重載
9 類成員獲取運(yùn)算符 -< 重載
上一篇:概述