1運算符重載的規則
C++ 幾乎可以重載全部的運算符,而且只能夠重載C++中已經有的。
不能重載的運算符:“.”、“.*”、“::”、“?:”
重載之后運算符的優先級和結合性都不會改變。
重載的兩種形式:
1 重載為類的非靜態成員函數;
2 重載為非成員函數。
?
?
2雙目運算符重載為成員函數
函數類型 operator 運算符(形參)
{
......
}
參數個數=原操作數個數-1 (后置++、--除外)
雙目運算符重載規則:
如果要重載 B 為類成員函數,使之能夠實現表達式 oprd1 B oprd2,其中 oprd1 為A 類對象,則 B 應被重載為 A 類的成員函數,
形參類型應該是 oprd2 所屬的類型。
經重載后,表達式 oprd1 B oprd2 相當于 oprd1.operator B(oprd2)
//例8-1復數類加減法運算重載為成員函數 #include<iostream> using namespace std; class Complex{ public:Complex(double r = 0.0, double i = 0.0):real(r), image(i){}Complex operator +(const Complex &c2) const;Complex operator -(const Complex &c2) const;void display() const; private:double real;double image; }; Complex Complex::operator+(const Complex &c2) const{return Complex(real+c2.real, image+c2.image);//創建一個臨時無名對象作為返回值 } Complex Complex::operator-(const Complex &c2) const{return Complex(real-c2.real, image-c2.image); } void Complex::display() const{cout << "(" << real << ", " << image << ")" << endl; } int main(){Complex c1(5,4),c2(2,10),c3;cout << "c1 = "; c1.display();cout << "c2 = "; c2.display();c3 = c1 - c2;cout << "c3 = c1 - c2 = "; c3.display();c3 = c1 + c2;cout << "c3 = c1 + c2 = "; c3.display();return 0; }
?
?
3單目運算符重載為成員函數
前置單目運算符重載規則:
如果要重載 U 為類成員函數,使之能夠實現表達式 U oprd,其中 oprd 為A類對象,則 U 應被重載為 A 類的成員函數,無形參。
經重載后,表達式 U oprd 相當于 oprd.operator U()
后置單目運算符 ++和--重載規則:
如果要重載 ++或--為類成員函數,使之能夠實現表達式 oprd++ 或 oprd-- ,其中 oprd 為A類對象,則 ++或-- 應被重載為 A 類的成員函數,且具有一個 int 類型形參。
經重載后,表達式 oprd++ 相當于 oprd.operator ++(0)
?
//例8-2重載前置++和后置++為時鐘類成員函數 #include<iostream> using namespace std; class Clock{ public:Clock(int hour = 0, int minute = 0, int second = 0);void showTime() const;Clock& operator ++();//前置單目運算符重載Clock operator ++ (int);//用參數表來區分兩個重載函數,函數體中不適用 private:int hour, minute, second; }; Clock::Clock(int hour, int minute, int second){if(0 <= hour && hour < 24 && 0 <= minute && minute < 60 && 0 <= second && second <60){this->hour = hour;this->minute = minute;this->second = second;}else{cout << "Time error!" << endl;} } void Clock::showTime() const{cout << hour << " : " << minute << " : " << second << endl; } Clock &Clock::operator ++ (){//返回本類對象的引用second++;if(second >= 60){second-=60;minute++;if(minute >= 60){minute-=60;hour = (hour+1)%24;}}return *this; } Clock Clock::operator ++(int){Clock old = *this;++(*this);//調用前置++運算符(形參)return old; } int main(){Clock myClock(23,59,59);cout << "First time output: ";myClock.showTime();cout << "Show myClock++: ";(myClock++).showTime();cout << "Show ++myClock: ";(++myClock).showTime();return 0; }
?
?
?
4運算符重載為非成員函數
運算符重載為非成員函數的規則:
函數的形參代表依自左至右次序排列的各操作數。
參數個數=原操作數個數(后置++、--除外)
至少應該有一個自定義類型的參數。
如果在運算符的重載函數中需要操作某類對象的私有成員,可以將此函數聲明為該類的友元。
雙目運算符 B重載后,
表達式oprd1 B oprd2
等同于operator B(oprd1,oprd2)
前置單目運算符 B重載后,
表達式 B oprd
等同于operator B(oprd )
后置單目運算符 ++和--重載后,
表達式 oprd B
等同于operator B(oprd,0)
?
//例8-3 重載Complex的加減法和“<<”運算符為非成員函數 #include<iostream> using namespace std; class Complex{ public:Complex(double r = 0.0, double i = 0.0):real(r), image(i){}friend Complex operator+(const Complex &c1, const Complex &c2);friend Complex operator-(const Complex &c1, const Complex &c2);//它的左操作數是std::ostream引用,右操作數為復數類的常引用,返回std::ostream引用friend ostream &operator<<(ostream &out, const Complex &c); private:double real;double image; };Complex operator+(const Complex &c1, const Complex &c2){return Complex(c1.real+c2.real, c1.image+c2.image); } Complex operator-(const Complex &c1, const Complex &c2){return Complex(c1.real-c2.real, c1.image-c2.image); } ostream &operator<<(ostream &out, const Complex &c){out << "(" << c.real << ", " << c.image << ")";return out; } int main(){Complex c1(5,4),c2(2,10),c3;cout << "c1 = " << c1 << endl;cout << "c2 = " << c2 << endl;c3 = c1 - c2;cout << "c3 = c1 - c2 = " << c3 << endl;c3 = c1 + c2;cout << "c3 = c1 + c2 = " << c3 << endl;return 0; }
?