C++允許函數(shù)和運(yùn)算符多個(gè)定義形导,當(dāng)重載函數(shù)或者重載運(yùn)算符被調(diào)用的時(shí)候环疼,編譯器將決定使用的參數(shù)類型與定義函數(shù)中參數(shù)類型進(jìn)行比對(duì),選擇對(duì)合適的函數(shù)朵耕,這個(gè)過程也就是重載決策秦爆。
1. 函數(shù)重載
函數(shù)同名,參數(shù)不同憔披。
#include <iostream>
using namespace std;
class Print
{
public:
void print(int n)
{
cout << "int : " << n << endl;
}
void print(float f)
{
cout << "float : " << f << endl;
}
};
int main(int argc, char **argv)
{
Print p;
p.print(3);
p.print(3.14);
return 0;
}
//輸出:
//int : 3
//float : 3.14
2. 運(yùn)算符重載
大部分運(yùn)算符都可以進(jìn)行重載等限,用于自定義運(yùn)算類型爸吮,當(dāng)然也有例外的運(yùn)算符:
#include <iostream>
using namespace std;
class AREA
{
private:
int length;
int width;
public:
AREA()
{
length = 0;
width = 0;
}
AREA(int len, int wid)
{
length = len;
width = wid;
}
public:
void SetLength(int len)
{
length = len;
}
void SetWidth(int wid)
{
width = wid;
}
int GetLength()
{
return length;
}
int GetWidth()
{
return width;
}
public:
AREA operator+(const AREA &area)
{
AREA temp;
temp.length = length + area.length;
temp.width = width + area.width;
return temp;
}
AREA operator-()
{
AREA temp;
temp.length = -length;
temp.width = -width;
return temp;
}
void operator=(const AREA &area)
{
length = area.length;
width = area.width;
}
bool operator==(const AREA &area)
{
return length == area.length && width == area.width;
}
bool operator<(const AREA &area)
{
if (length < area.length)
{
return true;
}
if (length == area.length && width < area.width)
{
return true;
}
return false;
}
bool operator>(const AREA &area)
{
if (length > area.length)
{
return true;
}
if (length == area.length && width > area.width)
{
return true;
}
return false;
}
friend ostream & operator<<(ostream & output, const AREA &area)
{
output << "len : " << area.length << ", wid : " << area.width << endl;
return output;
}
friend istream & operator>>(istream & input, AREA &area)
{
input >> area.length >> area.width;
return input;
}
AREA operator()(int a, int b, int c, int d)
{
AREA area;
area.length = a + b;
area.width = c + d;
return area;
}
AREA operator++()
{
++length;
++width;
return AREA(length, width);
}
AREA operator++(int)
{
AREA area(length, width);
++area.length;
++area.width;
return area;
}
};
int main(int argc, char **argv)
{
AREA a, b, c, d, e;
a.SetLength(3);
a.SetWidth(4);
b.SetLength(5);
b.SetWidth(5);
// 求和
c = a + b;
cout << "c.length : " << c.GetLength()<< endl;
cout << "c.width : " << c.GetWidth()<< endl;
// 大于
cout << "a > b : " << (a > b) << endl;
// 小于
cout << "a < b : " << (a < b) << endl;
// 取反
d = -a;
cout << "d.length : " << d.GetLength()<< endl;
cout << "d.width : " << d.GetWidth()<< endl;
// >>
// 輸入length和width
cin >> e;
cout << "e.length : " << e.GetLength()<< endl;
cout << "e.width : " << e.GetWidth()<< endl;
// <<
cout << "a : " << a << endl;
// ()
a(1, 2, 1, 2);
// 前綴++
++b;
// 后綴++
c++;
return 0;
}
有一個(gè)特殊的運(yùn)算符是[]
,不是因?yàn)橛梅ㄌ厥馔牛羌刹坏缴厦孢@個(gè)類里(笑)形娇,所以單獨(dú)寫出來
#include <iostream>
using namespace std;
const int ARRAY_SIZE = 10;
class SPECIAL
{
private:
int array[ARRAY_SIZE];
public:
SPECIAL()
{
for (int i = 0; i < ARRAY_SIZE; ++i)
{
array[i] = i;
}
}
int & operator[](int pos)
{ // 這里只是舉個(gè)使用的示例,最好還是在使用數(shù)組下標(biāo)前確認(rèn)是否合法
if (pos < 0)
{
return array[0];
}
else if (pos > ARRAY_SIZE)
{
return array[ARRAY_SIZE - 1];
}
return array[pos];
}
};
int main(int argc, char **argv)
{
SPECIAL ps;
cout << "-1 : " << ps[-1] << endl;
cout << "100 : " << ps[100] << endl;
cout << "3 : " << ps[3] << endl;
return 0;
}
常見的運(yùn)算符重載就這些筹误,如果有遺漏桐早,以后再補(bǔ)充。