您好,登錄后才能下訂單哦!
什么是運(yùn)算符重載?
顧名思義就是將原本的操作符以我們的方式定義出來(lái),方便我們使用。
為什么要進(jìn)行運(yùn)算符重載?
簡(jiǎn)單的理由就是將減少程序員的工作量,首先先看一個(gè)簡(jiǎn)單的例子:
class A{ public: A(int data):data(data){}; void show(){ cout << "data = " << data << endl; } private: int data; }; int main(int ac, char *av[]) { A a1(100), a2(200); (a1+a2).show(); //請(qǐng)注意這一句我們可以這樣嗎?編譯一下看看 return 0; } 編譯結(jié)果: [root@anna-laptop day11]# cc.sh overload_operator.cpp ======================== C++_program Compling ===================== overload_operator.cpp: In function ‘int main(int, char**)’: overload_operator.cpp:17: error: no match for ‘operator+’ in ‘a(chǎn)1 + a2’ ERROR g++ -o overload_operator.cpp -g -lpthread
這樣的結(jié)果并不是我們想要的,我們只是想相加一下兩個(gè)對(duì)象里面數(shù)據(jù)并且將結(jié)果顯示出來(lái),但是操作符“+”的左右兩邊的變量必須是內(nèi)置變量類型。所以為了方便,我們可以為我們自定義類型的對(duì)象對(duì)操作符“+”進(jìn)行運(yùn)算符重載,進(jìn)行如下更改:
class A{ public: A(int data):data(data){}; void show(){ cout << "data = " << data << endl; } // 運(yùn)算符重載函數(shù) A operator+(const A& a){ return A(data + a.data); } private: int data; }; int main(int ac, char *av[]) { A a1(100), a2(200); (a1+a2).show(); return 0; }
如我們所愿,進(jìn)行如上更改我們完成了直接讓兩個(gè)類對(duì)象進(jìn)行直接相加,大大減少了程序員的工作量。下來(lái)我們細(xì)細(xì)談一下運(yùn)算符重載函數(shù)的具體內(nèi)容:
運(yùn)算符重載函數(shù)的定義和調(diào)用分為兩種:
1、以友元函數(shù)定義
定義格式: friend return_val operatorOPT(type& name...);
調(diào)用格式:operatorOPT(obj_list);
obj1 OPT obj2;
友元不是成員,不能直接在友元函數(shù)中使用對(duì)象的成員變量,也不能使用this指針,所以在進(jìn)行函數(shù)調(diào)用的時(shí)候,需要將對(duì)象的成員函數(shù)傳進(jìn)去。
2、以成員函數(shù)函數(shù)定義
定義格式:return_val operatorOPT(type& name...);
注意:在使用成員函數(shù)進(jìn)行調(diào)用的時(shí)候,如果使用對(duì)象的成員變量,不用將成員變量再傳入函數(shù)中,直接在成員函數(shù)中使用就可以。
調(diào)用格式:obj1.operatorOPT(obj2);
obj1 OPT obj2;
下面舉例來(lái)進(jìn)行說(shuō)明:
class F{ public: F(int n = 0, int d = 1):n(n), d(d){} // 以成員函數(shù)對(duì)操作符進(jìn)行重載 F operator*(const F& o)const{ return F(o.n * n, o.d * d); } // 以友元函數(shù)對(duì)操作符進(jìn)行重載,友元函數(shù)的聲明 friend F operator/(const F& obj1, const F& obj2); private: int n; int d; }; // 友元函數(shù)的定義 F operator/(const F& obj1, const F& obj2) { return(obj1.n * obj2.d, obj1.d * obj2.n); } int main(int ac, char *av[]) { F f1(1,2); F f2(3,4); F f3; f3 = f1.operator*(f2); f3.show(); (f1*f2).show(); f3 = operator/(f1, f2); f3.show(); (f1/f2).show(); return 0; }
在進(jìn)行運(yùn)算符重載的時(shí)候我們需要注意兩個(gè)問(wèn)題:
1、在運(yùn)算符的操作數(shù),必須至少含有一個(gè)自定義類型的變量。
2、盡量使用成員函數(shù)對(duì)運(yùn)算符進(jìn)行重載,但是有的運(yùn)算符只能使用友元函數(shù)進(jìn)行重載。
比如對(duì)于"<<" 和“>>”的重載,如下:
class F{ public: F(int n = 0, int d = 1):n(n), d(d){} friend ostream& operator<<(ostream& os, const F& f){ os << f.n << '/' << f.d; return os; } friend istream& operator>>(istream& is, F& f){ char ch; is >> f.n >> ch >> f.d; return is; } F operator*(const F& o)const{ return F(o.n * n, o.d * d); } friend F operator/(const F& obj1, const F& obj2); private: int n; int d; }; F operator/(const F& f1, const F& f2) { return(f1.n * f2.d, f1.d * f2.n); } int main(int ac, char *av[]) { F f1(1,2); F f2(3,4); cout << f1 << "*" << f2 << "=" << f1*f2 << endl; cout << f1 << "/" << f2 << "=" << f1/f2 << endl; cout << "enter 2 number : \n"; cin >> f1 >> f2; cout << "f1 = " << f1 << endl; cout << "f2 = " << f2 << endl; return 0; } 運(yùn)行結(jié)果: [root@anna-laptop overload_operator]# ./muldiv [1/2]*[3/4]=[3/8] [1/2]/[3/4]=[4/6] enter 2 number : 123 / 456 234/ 7645 f1 = [123/456] f2 = [234/7645]
以上的操作符全是對(duì)于雙目運(yùn)算符的重載,下面簡(jiǎn)單介紹幾個(gè)單目運(yùn)算符的例子,如"++"和"--"
因?yàn)?+有前置++和后置++兩種,--也是如此,對(duì)于前置++我們直接將++后的結(jié)果直接返回即可,對(duì)于后置++,為了方便區(qū)別于前置++,通常認(rèn)為++后面仍然含有一個(gè)int類型的數(shù)組。進(jìn)行如下操作:
class A{ public: A(int data = 0):data(data){} friend ostream& operator<<(ostream& os, const A& a){ os << a.data; return os; } friend istream& operator>>(istream& is, A& a){ is >> a.data; return is; } // 前置 ++; friend A& operator++(A& a){ a.data += 10; return a; } // 前置 -- A& operator--(){ data -= 10; return *this; } // 后置 ++; friend A operator++(A& a, int){ A old(a); a.data += 5; return old; } // 后置 -- A operator--(int){ A old(*this); data -= 5; return old; } private: int data; }; int main(int ac, char *av[]) { A a1(100); A a2(100); cout << "a1 = " << a1 << endl; cout << "a2 = " << a2 << endl; ++a1; --a2; cout << "++a1 = " << a1 << endl; cout << "--a2 = " << a2 << endl; cout << "a1++ = " << a1++ << endl; cout << "a2-- = " << a2-- << endl; cout << "a1 = " << a1 << endl; cout << "a2 = " << a2 << endl; return 0; }
當(dāng)然還有以下操作符不能進(jìn)行重載:
1、三目運(yùn)算符不能進(jìn)行重載;
2、"."成員運(yùn)算符不能重載;
3、成員指針運(yùn)算符不能進(jìn)行重載;
4、"::"這是對(duì)于類的運(yùn)算符,不能進(jìn)行重載。
================= 以上就是對(duì)于運(yùn)算符重載的介紹 =======================
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。