C++运算符重载(成员函数方式)
一、運(yùn)算符重載
C++中預(yù)定義的運(yùn)算符的操作對(duì)象只能是基本數(shù)據(jù)類型,實(shí)際上,對(duì)于很多用戶自定義類型,也需要有類似的運(yùn)算操作。如果將C++中這些現(xiàn)存的運(yùn)算符直接作用于用戶自定義的類型數(shù)據(jù)上,會(huì)得到什么樣的結(jié)果呢?編譯器無(wú)法給出正常的結(jié)果,因?yàn)槲覀冃枰\(yùn)算符重載,給運(yùn)算符賦予多重含義,使同一個(gè)運(yùn)算符作用于不同類型的數(shù)據(jù)導(dǎo)致不同類型的行為,增強(qiáng)了運(yùn)算符的普適性。
運(yùn)算符重載的實(shí)質(zhì)是函數(shù)重載。在實(shí)現(xiàn)過(guò)程中,首先把指定的運(yùn)算表達(dá)式轉(zhuǎn)化為對(duì)運(yùn)算符函數(shù)的調(diào)用,運(yùn)算對(duì)象轉(zhuǎn)化為運(yùn)算符函數(shù)的實(shí)參,然后根據(jù)實(shí)參的類型來(lái)確定需要調(diào)用達(dá)標(biāo)函數(shù),這個(gè)過(guò)程在編譯過(guò)程中完成。
運(yùn)算符重載規(guī)則如下:?
①、 C++中的運(yùn)算符除了少數(shù)幾個(gè)之外,全部可以重載,而且只能重載C++中已有的運(yùn)算符。?
②、 重載之后運(yùn)算符的優(yōu)先級(jí)和結(jié)合性都不會(huì)改變。?
③、 運(yùn)算符重載是針對(duì)新類型數(shù)據(jù)的實(shí)際需要,對(duì)原有運(yùn)算符進(jìn)行適當(dāng)?shù)母脑臁R话銇?lái)說(shuō),重載的功能應(yīng)當(dāng)與原有功能相類似,不能改變?cè)\(yùn)算符的操作對(duì)象個(gè)數(shù),同時(shí)至少要有一個(gè)操作對(duì)象是自定義類型。?
C++中只有五個(gè)運(yùn)算符不能被重載,它們是:成員運(yùn)算符“.”、指針運(yùn)算符“*”、作用域運(yùn)算符“::”、“sizeof”、條件運(yùn)算符“?:”。?
運(yùn)算符重載形式有兩種,重載為類的成員函數(shù)和重載為類的友元函數(shù)。?
運(yùn)算符重載為類的成員函數(shù)的一般語(yǔ)法形式為:?
函數(shù)類型 operator 運(yùn)算符(形參表) { 函數(shù)體; } 運(yùn)算符重載為類的友元函數(shù)的一般語(yǔ)法形式為:?
friend 函數(shù)類型 operator 運(yùn)算符(形參表) { 函數(shù)體; }
其中,函數(shù)類型就是運(yùn)算結(jié)果類型;operator是定義運(yùn)算符重載函數(shù)的關(guān)鍵字;運(yùn)算符是重載的運(yùn)算符名稱。?
當(dāng)運(yùn)算符重載為類的成員函數(shù)時(shí),函數(shù)的參數(shù)個(gè)數(shù)比原來(lái)的操作個(gè)數(shù)要少一個(gè);當(dāng)重載為類的友元函數(shù)時(shí),參數(shù)個(gè)數(shù)與原操作數(shù)個(gè)數(shù)相同。原因是重載為類的成員函數(shù)時(shí),如果某個(gè)對(duì)象使用重載了的成員函數(shù),自身的數(shù)據(jù)可以直接訪問(wèn),就不需要再放在參數(shù)表中進(jìn)行傳遞,少了的操作數(shù)就是該對(duì)象本身。而重載為友元函數(shù)時(shí),友元函數(shù)對(duì)某個(gè)對(duì)象的數(shù)據(jù)進(jìn)行操作,就必須通過(guò)該對(duì)象的名稱來(lái)進(jìn)行,因此使用到的參數(shù)都要進(jìn)行傳遞,操作數(shù)的個(gè)數(shù)就不會(huì)有變化。?
運(yùn)算符重載的主要優(yōu)點(diǎn)就是允許改變使用于系統(tǒng)內(nèi)部的運(yùn)算符的操作方式,以適應(yīng)用戶自定義類型的類似運(yùn)算。
二、運(yùn)算符重載程序例子(成員函數(shù)方式)
//運(yùn)算符重載:成員函數(shù)方式 #include <iostream> using namespace std;class complex //復(fù)數(shù)類 { public:complex(){ real = imag = 0;}complex(double r, double i){real = r;imag = i;}complex operator + (const complex &c);complex operator - (const complex &c);complex operator * (const complex &c);complex operator / (const complex &c);friend void print(const complex &c); //友元函數(shù)private:double real; //實(shí)部double imag; //虛部};inline complex complex::operator + (const complex &c) //定義為內(nèi)聯(lián)函數(shù),代碼復(fù)制,運(yùn)算效率高 {return complex(real + c.real, imag + c.imag); }inline complex complex::operator - (const complex &c) {return complex(real - c.real, imag - c.imag); }inline complex complex::operator * (const complex &c) {return complex(real * c.real - imag * c.imag, real * c.real + imag * c.imag); }inline complex complex::operator / (const complex &c) {return complex( (real * c.real + imag * c. imag) / (c.real * c.real + c.imag * c.imag), (imag * c.real - real * c.imag) / (c.real * c.real + c.imag * c.imag) ); }void print(const complex &c) {if(c.imag < 0)cout<<c.real<<c.imag<<'i'<<endl;elsecout<<c.real<<'+'<<c.imag<<'i'<<endl; }int main() { complex c1(2.0, 3.5), c2(6.7, 9.8), c3;c3 = c1 + c2;cout<<"c1 + c2 = ";print(c3); //友元函數(shù)不是成員函數(shù),只能采用普通函數(shù)調(diào)用方式,不能通過(guò)類的對(duì)象調(diào)用c3 = c1 - c2;cout<<"c1 - c2 = ";print(c3);c3 = c1 * c2;cout<<"c1 * c2 = ";print(c3);c3 = c1 / c2;cout<<"c1 / c2 = ";print(c3);return 0; }
三、程序運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的C++运算符重载(成员函数方式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 云计算平台管理的三大利器Nagios、G
- 下一篇: C++运算符重载(友元函数方式)