操作符過載的兩種用法(前置後置++)
一.操作符過載基礎:
運算子函式是一種特殊的成員函式或友元函式
1.過載為類成員函式,解釋為:
ObjectL.operator op(ObjectR)
左運算元由ObjectL通過this指標傳遞,右運算元由引數ObjectR傳遞
2.過載為友元函式,解釋為:
operator op(ObjectL,ObjectR)
左右運算元都由引數傳遞
3.為什麼要有操作符過載
a=a+b;//int是基礎型別,c++編譯器已經為這些型別提供+操作
Complex c1=c1+c2;//Complex是自定義型別,編譯器根本不知道如何加,但c++編譯器會給你提供一個機制,讓你實現自定義型別+
例子程式碼如下,重要的地方有標記:
class Complex{
friend Complex operator+(Complex &c1, Complex &c2);
friend Complex& operator++( Complex &c2);//前置++友元函式的實現
public:
Complex(int a = 0, int b = 0)
{
this->a = a;
this->b = b;
}
void print()
{
cout << a << "+" << b << "i" << endl;
}
private:
int a;
int b;
//通過類的成員函式實現-操作;左運算元被隱藏在this指標,右運算元就在引數中
public:
Complex operator-(Complex &c2)
{
Complex tmp;
tmp.a = this->a - c2.a;
tmp.b = this->b - c2.b;
return tmp;
}
public:
Complex& operator--()//通過類的成員函式實現--操作;左運算元被隱藏在this指標,右運算元就在引數中
{
this->a--;
this->b--;
return *this;
}
};
Complex operator+(Complex &c1, Complex &c2)//全域性函式實現+操作寫法
{
Complex tmp;
tmp.a = c1.a + c2.a;
tmp.b = c1.b + c2.b;
return tmp;
}
Complex& operator++( Complex &c2)//全域性函式實現++操作寫法
{
c2.a++;
c2.b++;
return c2;
}
void main()
{
Complex c1(1, 2), c2(3, 4);
Complex c3;
c3.print();
Complex c4 = operator+(c1,c2);//友元函式的寫法
c4.print();
Complex c7= c1+c2;//友元函式的寫法
c7.print();
Complex c5 =c1.operator-(c2);//累的成員函式寫法
c5.print();
Complex c6 = c1-c2;
c6.print();
++c2;
c2.print();
--c2;
c2.print();
system("pause");
}
//後置--
Complex operator--(int)
{
Complex tmp = *this;
this->a --;
this->b --;
return tmp;
}
//後置++
Complex operator++(int)
{
Complex tmp = *this;
this->a ++;
this->b ++;
return tmp;
}
二.操作符過載的三個步驟(類成員函式方法進行的時候)
//目標:通過類的成員函式,完成操作符過載
1.要承認操作符過載是一個函式,完成操作符過載
2.寫出函式呼叫語言 c1.operator-(c2)
3.完善函式原型
全域性函式過載操作符友元用武之地
原因:
cout<<c1<<"鏈式程式設計測試"<<endl;
operator<<(cout,c1);
cout.operator<<(c1);