C++ 允許在同一范圍內(nèi)對一個函數(shù)名或一個操作符指定多個定義,分別被稱為函數(shù)重載和操作符重載。
重載聲明是在同一的范圍內(nèi)對先前已經(jīng)聲明的相同函數(shù)名的聲明,除非這兩個聲明有不同的參數(shù)和明顯不同的定義(實現(xiàn)方式)。
當(dāng)你調(diào)用一個重載的函數(shù)或操作符時,編譯器通過比較用來調(diào)用函數(shù)或操作符的指定的參數(shù)類型來確定使用最合適的定義。選擇最合適的重載函數(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++ 已有的操作符。因此,程序員可以像使用用戶自定義類型一樣使用操作符?!?/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)算符:
+ | - | * | / | % | ^ |
& | | | ~ | ! | , | = |
< | > | <= | >= | ++ | -- |
<< | >> | == | != | && | || |
+= | -= | /= | %= | ^= | &= |
|= | *= | <<= | >>= | [ ] | () |
-> | ->* | new | new[ ] | delete | delete[ ] |
下面這張表列舉了不可以重載的運(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)算符 -< 重載 |