运算符重载的意义
运算符重载使得运算分量可以是类对象,甚至自己定义的类。最直观的好处就是使得代码更加直观、易懂。
重载运算符的几点注意
- 运算符重载时,要注意该重载运算符的运算顺序和优先级不变。
- c++规定,运算符中,参数说明都是内部类型时,不能重载。
- c++规定,“. 、::、* 、?、->”都不能重载。
如何进行运算符重载
我们以RMB这个类为例,重载+运算符:
当作为一个非成员函数时:
返回类型 operator 运算符(形参表)
{
函数体;
}
RMB operator +(RMB& s1,RMB& s2)
{
unsigned int jf=s1.jf+s2.jf;
unsigned int yuan=s1.yuan+s2.yuan;
RMB result(yuan,jf);
return result;
}
当作为一个成员函数时:
返回类型 类名::operator 运算符(形参表)
{
函数体;
}
RMB RMB::operator +(RMB& s)
{
unsigned int jf=jf+s.jf;
unsigned int yuan=yuan+s.yuan;
RMB result(yuan,jf);
return result;
}
可见函数体内容几乎相同,所不同是成员函数的运算符重载少了一个参数,而这个参数就是this,指向当前对象。
几种常见的运算符重载
- 前增量与后增量的区别
使用前增量对对象进行修改,然后再返回该对象,所以前增量运算符操作时,参数与返回的是同一个对象。后增量时,必须在增量之前返回原有的对象值。为此需要创建一个临时对象,存放原有的对象。
RMB& RMB::operator ++()//前增量
{
value++;
return *this;
}
RMB RMB::operator ++(int)//后增量
{
RMB tmp(*this);
value++;
return tmp;
}
- 转换运算符
有了转换运算符,不必提供对象参数的重载运算符。就是可以将类对象转换成基本成员变量。
operator 类型名()
{
}
- 赋值运算符
赋值运算符把一个对象的成员变量赋予一个已经存在的同类对象的同名变量;而拷贝构造函数用已存在的对象创建一个相同的新对象。赋值运算符的几点注意事项:
- 返回值的类型一般得是该类型的引用。因为只有返回一个引用,才可以连续赋值。
- 传入的参数类型需要声明为常量引用。因为如果不声明为引用,那么就存在实参到形参会调用一次复制函数,而把参数声明为引用就可以避免这样无谓的消耗,能提高代码的效率。同时赋值运算不应该修改传入变量的状态,故需要声明为常量。
- 释放实例自身已有的内存,要么是调用实例自身的析构函数要么就是直接释放内存;
- 需要判断传入的参数和当前的实例是不是同一个实例;如果是,则不进行赋值运算直接返回*this,否则进行赋值运算。因为如果传入的参数和当前的实例是同一个,那么在进行3时,释放掉了自身的内存,就无法进行赋值运算了。