重载函数和重载运算符
C++允許在同一個(gè)作用域中的某個(gè)函數(shù)和運(yùn)算符指定多個(gè)定義,分別稱(chēng)為函數(shù)重載和運(yùn)算符重載。
重載聲明是指一個(gè)與之前已經(jīng)在該作用域內(nèi)聲明過(guò)的函數(shù)或方法具有相同名稱(chēng)的聲明,但他們的參數(shù)列表和定義(實(shí)現(xiàn))不相同。
當(dāng)調(diào)用一個(gè)重載函數(shù)或重載運(yùn)算符時(shí),編譯器通過(guò)把函數(shù)所使用的參數(shù)類(lèi)型和定義中的參數(shù)類(lèi)型進(jìn)行比較,決定選用最合適的定義。
選擇最合適的重載函數(shù)或重載運(yùn)算符的過(guò)程,稱(chēng)為重載決策。
?
C++函數(shù)重載
在同一個(gè)作用域內(nèi),可以聲明幾個(gè)功能類(lèi)似的同名函數(shù),但是這些同名函數(shù)的形式參數(shù)(參數(shù)個(gè)數(shù),類(lèi)型或者順序)必須不同,不能僅通過(guò)返回類(lèi)型的不同來(lái)重載函數(shù)。
/*** overload.cpp ***/ #include<iostream> using namespace std;class printData {public:void print(int i){cout << "integer is : " << i << endl;}void print(double f){cout << "flota is : " << f << endl;}void print(char c[]){cout << "char is : " << c << endl;} };int main() {printData pd;pd.print(5);pd.print(300.1);char c[] = "hello C++";pd.print(c);return 0; }運(yùn)行結(jié)果:
exbot@ubuntu:~/wangqinghe/C++/20190807$ vim overload.cpp
exbot@ubuntu:~/wangqinghe/C++/20190807$ g++ overload.cpp -o overload
exbot@ubuntu:~/wangqinghe/C++/20190807$ ./overload
integer is : 5
flota is : 300.1
char is : hello C++
?
運(yùn)算符重載:
我們可以重新定義或重在大部分C++內(nèi)置的運(yùn)算符。這樣就可以使用自定義的運(yùn)算符了。
重載的運(yùn)算符是帶有特殊名稱(chēng)的函數(shù),函數(shù)名是由關(guān)鍵字operator和其后要重載的運(yùn)算符號(hào)構(gòu)成。和其他函數(shù)一樣,重載運(yùn)算符有一個(gè)返回類(lèi)型和一個(gè)參數(shù)列表。
Box operator+(const Box&);
?
聲明加法運(yùn)算符用于把兩個(gè)Box對(duì)象相加,返回最終的的Box對(duì)象。大多數(shù)重載運(yùn)算符可被定義為普通的非成員函數(shù)或被定義為類(lèi)成員函數(shù)。
如果我們定義上面的的函數(shù)為類(lèi)的非成員函數(shù),那么我們需要為每次操作傳遞兩個(gè)參數(shù)。如下所示:
Box operator+(const Box&, const Box&);下面實(shí)例中,對(duì)象作為參數(shù)進(jìn)行傳遞,對(duì)象的屬性使用this運(yùn)算符進(jìn)行訪(fǎng)問(wèn):
/***
overfun.cpp
***/
#include<iostream>
using namespace std;
?
class Box
{
??? public:
??????? Box(double l = 2.0,double b = 2.0,double h = 2.0)
??????? {
??????????? length = l;
??????????? breadth = b;
??????????? height = h;
??????? }
??????? double getVolume()
??????? {
??????????? return length*breadth*height;
??????? }
??????? 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;
??????? double breadth;
??????? double height;
};
?
int main()
{
??? Box box1(3.3,1.2,1.5);
??? Box box2(8.5,6.0,2.0);
??? Box box3;
??? double volume = 0.0;
?
??? volume = box1.getVolume();
??? cout << "Volume of box1 : " << volume << endl;
?
??? volume = box2.getVolume();
??? cout << "Volume of box2 : " << volume << endl;
?
??? box3 = box1 + box2;
?
??? volume = box3.getVolume();
??? cout << "Volume of box3 : " << volume << endl;
?
??? return 0;
}
運(yùn)行結(jié)果:
exbot@ubuntu:~/wangqinghe/C++/20190808$ g++ overfun.cpp -o overfun
exbot@ubuntu:~/wangqinghe/C++/20190808$ ./overfun
Volume of box1 : 5.94
Volume of box2 : 102
Volume of box3 : 297.36
?
可重載運(yùn)算符:
| 雙目算數(shù)運(yùn)算符 | +,-,*,/,% |
| 關(guān)系運(yùn)算符 | ==,!=,<,>,<= ,>= |
| 邏輯運(yùn)算符 | || , &&? , ! |
| 單目運(yùn)算符 | +(正),-(負(fù)),*(指針),&(取地址) |
| 自增自減運(yùn)算符 | ++,-- |
| 位運(yùn)算符 | | , &,~,^, ?<< , >> |
| 賦值運(yùn)算符 | =,+=,-=,*=,/=,%=,&=,|=,^=, <<=,>>= |
| 空間申請(qǐng)與釋放 | new,delete,new[].delete[] |
| 其他運(yùn)算符 | () (函數(shù)調(diào)用),->(成員訪(fǎng)問(wèn), ,(逗號(hào)),[] (下標(biāo)) |
?
不可重載運(yùn)算符列表:
| . | 成員訪(fǎng)問(wèn)運(yùn)算符 |
| .*,->* | 成員指針訪(fǎng)問(wèn)運(yùn)算符 |
| :: | 域運(yùn)算符 |
| seizeof | 長(zhǎng)度運(yùn)算符 |
| ?: | 條件運(yùn)算符 |
| # | 預(yù)處理符號(hào) |
Attention:
?
類(lèi)重載、覆蓋、重定義的區(qū)別:
重載指的是函數(shù)具有不同的參數(shù)列表,而函數(shù)名相同的函數(shù)。重載要求參數(shù)列表必須不同,比如參數(shù)的類(lèi)型不同、參數(shù)的個(gè)數(shù)不同,參數(shù)的順序不同。因?yàn)橹剌d要求參數(shù)列表必須不同。(同一類(lèi)中)
覆蓋是存在類(lèi)中,子類(lèi)重寫(xiě)從基類(lèi)繼承過(guò)來(lái)的函數(shù)。被重寫(xiě)的函數(shù)不能是static的。必須是virtual的。但函數(shù)名、返回值、參數(shù)列表都必須和基類(lèi)相同(發(fā)生在基類(lèi)和子類(lèi))。
重定義也叫做隱藏,子類(lèi)重新定義父類(lèi)中有相同名稱(chēng)的非虛函數(shù)(參數(shù)列表可以不同)。(發(fā)生在子類(lèi)和基類(lèi))。
轉(zhuǎn)載于:https://www.cnblogs.com/wanghao-boke/p/11319273.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的重载函数和重载运算符的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 八仙全传之八仙过海剧情介绍
- 下一篇: 二元运算符重载