首先明白什么是一元,二元和多元运算符,比如++a、b--属于一元运算符,因为参与运算的参数只有一个,以此类推二元运算符就是参与运算的参数有两个,比如a+b。
一元运算符可以表示为:Object op\op Object
重载为成员函数为:Object.operator op(),操作数有对象Object通过this指针隐含传递。
重载为友元函数为:operator op(Object),操作数由参数表的参数Object提供。
再开始分析自增,自减操作符时,我们要理解:
前置自增、自减是参数先自增、自减运算完之后再使用(先运算,再使用)
后置自增、自减是参数先使用再自增、自减(先使用,再运算)
全局函数
Complex &operator++(Complex &c)
{
c.m_a++;
c.m_b++;
return c;
}
int main()
{
Complex c(1, 2);
++c;
c.PrintVal();
system("pause");
return 0;
}
成员函数
class Complex
{
Complex &operator--()
{
this->m_a--;
this->m_b--;
return *this;
}
};
int main()
{
Complex c(1, 2);
--c;
c.PrintVal();
system("pause");
return 0;
}
全局函数
Complex operator++(Complex &c,int)
{
Complex temp = c;
c.m_a++;
c.m_b++;
return temp;
}
int main()
{
Complex c(1, 2);
c++;
c.PrintVal();
system("pause");
return 0;
}
成员函数
class Complex
{
Complex operator++(int)
{
Complex temp = *this;
this->m_a++;
this->m_b++;
return temp;
}
};
int main()
{
Complex c(1, 2);
c++;
c.PrintVal();
system("pause");
return 0;
}
对于下面参数中的int,是一个占位符,作用是与前置++,前置--相区别。编译器区分用的。
Complex& operator++(Complex &c,int)
Complex &operator++(int)
1、首先承认操作符重载是一个函数,定义函数名operator++
2、分析函数参数,根据左右操作数的个数 operator++(Complex &c)
3、分析函数返回值,函数返回值充当左值 需要返回一个引用。
1.、当无法修改左操作数的类时,使用全局函数进行重载
2、=、[]、()和->操作符只能通过成员函数进行重载
3、类成员函数方法无法实现 << 操作符重载
无法修改左操作数的类时,怎么理解?意思就是说我们无法修改ostream和istream类,只能通过全局函数进行重载,
用友员函数重载 << 和 >> ,输出和输入用户自定义的数据类型
friend ostream& operator<<(ostream &out, Complex &c)
friend istream& operator>>(istream &in, Complex &c)
注:函数返回值充当左值 需要返回一个引用
友元函数重载操作符使用注意点
1.友员函数重载运算符常用于运算符的左右操作数类型不同的情况
2.在第一个参数需要隐式转换的情况下,使用友元函数重载
3.友元函数没有this指针,所需操作数都必须在参数表中显示声明,很容易实现类型的隐式转换