运算符的重载
重载运算符
- (“::”,“.*”,“.”,“?:”)不能被重载。
- 重载运算符时,不能改变其本质,如不能将“+”的求和运算重载为作差运算等。
- 优先级与结合律要与内置运算符保持一致。
- 若重载的运算符是成员函数时,this绑定到运算符的左侧对象。成员运算符的显式参数比运算对象总少一个。
note:
- 当把运算符定义为成员函数时,其左侧必须是运算符所属类型的一个对象。
- 下标运算符(“[]”)需要定义为成员函数。
- (“++”“--”)分为可分为前置版与后置版,为了区分前置与后置,我们在定义后置版时,加入一个int类型的形参加以区分(内置为0)。“int”的唯一作用就是用来做区分用的。
eg1:
string s = "word";
string t = s + "!";//等价于s.operator("!");
string u = "hi" + s;//等价于hi.operator(s)因此“<<”不能定义为成员函数
eg2:以复数的运算为例,我并未曾将所有的形式写完整,但是主体形式以经成型,剩下的基本用Ctrl+CV就能解决
#include<iostream>
using namespace std;
class Cplural
{
public:
void SetPlural(int a,int b);
void GetPlural();
//重载输入输出运算符
friend ostream &operator <<(ostream &os, const Cplural &plural);
friend istream &operator >> (istream &is, Cplural &plural);
//重载算术运算符 在此以+为例,— * / %等同理
//在此使用非成员函数形式
friend Cplural &operator+(const Cplural &plural1, const Cplural &plural2);
//== !=的重载
friend bool operator ==(const Cplural &plural1, const Cplural &plural2);
friend bool operator !=(const Cplural &plural1, const Cplural &plural2);
//递增 递减运算符的重载 在此仅以递增为例
Cplural &operator++();
Cplural &operator++(int);
private:
int a; //实部
int b; //虚部
};
void Cplural::SetPlural(int a,int b)
{
this->a = a;
this->b = b;
}
void Cplural::GetPlural()
{
}
Cplural & Cplural::operator++()
{
// TODO: 在此处插入 return 语句
++this->a;
++this->b;
return *this;
}
Cplural & Cplural::operator++(int)
{
// TODO: 在此处插入 return 语句
this->a++;
this->b++;
return *this;
}
ostream & operator<<(ostream & os, const Cplural & plural)
{
// TODO: 在此处插入 return 语句
os << plural.a << " + " << plural.b << "i";
return os;
}
istream & operator >> (istream & is, Cplural & plural)
{
// TODO: 在此处插入 return 语句
is >> plural.a >> plural.b;
if (!is)
{
plural.a = 0;
plural.b = 0;
}
return is;
}
Cplural & operator+(const Cplural & plural1, const Cplural & plural2)
{
// TODO: 在此处插入 return 语句
Cplural temp;
temp.a = plural1.a + plural2.a;
temp.b = plural1.b + plural2.b;
return temp;
}
bool operator==(const Cplural & plural1, const Cplural & plural2)
{
// TODO: 在此处插入 return 语句
if (plural1.a == plural2.a && plural1.b == plural2.b)
{
return true;
}
else
{
return false;
}
}
bool operator!=(const Cplural & plural1, const Cplural & plural2)
{
// TODO: 在此处插入 return 语句
if (plural1.a != plural2.a && plural1.b != plural2.b)
{
return true;
}
else
{
return false;
}
}
int main()
{
Cplural a1,a2,a3;
a1.SetPlural(5, 6);
a2.SetPlural(3, 4);
a3.SetPlural(3, 4);
/*a1++;
++a2;*/
cout << a1++ << " " << ++a2;
getchar();
getchar();
return 0;
}
网友评论