运算符重载:
赋予(扩展)运算符其他功能
person& person::operator+ (const person &other)
{
person tmp;
tmp.x = this->x + other.x;
tmp.y = this->y + other.y;
return tmp;
}
- 运算符重载和函数重载类似
- 重载函数本质上就是多个独立函数,重载机制在编译时发生,运行时不参与
- 函数重载的意义就是避免程序员自己不按规范命名,方便编写类库覆盖所有可能操作,是一种语法糖
person p1(1,3);
person p2(5,3);
p3 = p1+p2; //运算符重载后使用
p3 = p1.operator +(p2);//另一种写法
- 两种使用方法没有本质区别,只是格式不同
- p3 = p1.operator +(p2);更像调用函数
- p3 = p1+p2; 更符合数学逻辑
理解运算符重载的关键:
确定函数重载函数的返回值,传入参数,this指针指向的对象即可理解该函数作用。
运算符重载的细节:
=运算符在c++中有默认的运算符重载函数
=运算符重载函数和拷贝构造函数:
- 初始化时的赋值调用的是拷贝构造函数
- 非初始化时赋值调用的是=运算符重载函数
(=)赋值运算符重载函数参数中的const:
(1)如果运算符对其右侧的操作数并不改变,则应该在参数列表中使用const引用
(2)C++的const要求非常严格,=运算符重载函数的形参一定加const
避免赋值运算符中的自赋值
(1)自赋值就是Person a; a = a;
(2)自赋值如果不处理,轻则浪费效率,重则导致内存丢失(该深拷贝时做了浅拷贝)
(3)避免自赋值只需要在赋值运算符重载函数所有操作前加上一个判断 if (this != &other)即可
person& person::operator= (const person &other)
{
if(this != &other)
{
this->x = other.x;
this->y = other.y;
}
return *this;
}
运算符重载函数返回引用:
1)赋值运算符重载函数可以返回对象类型,也可以返回引用类型
2)返回引用可以避免一次返回值传递的对象复制
3)cpp不强制要求返回引用,但好的代码一般都这么用
4)返回引用支持连续赋值
传参时传引用:
1)如果传对象,调用时是值传递,调用时复制一次,额外开销
2)如果传指针,也可以工作,使用时为了符合参数格式要写成a=&b;写法不符合习惯
3)引用的发明就是因为运算符重载传参的尴尬
参数传引用,返回类型也是引用 是运算符重载函数最标准的写法
重载运算符的两种方法:
-
使重载运算符成为该类的成员函数。这允许运算符函数访问类的私有成员。它也允许函数使用隐式的this指针形参来访问调用对象。
-
使重载的成员函数成为独立的函数。当以这种方式重载时,运算符函数必须 声明为类的友元才能访问类的私有成员。这两种方式效率没有区别
-
某些运算符(<< 和>>)必须作为独立函数重载,大部分运算符两种都可以
-
对于二元运算符(两个操作数)重载为独立函数更符合逻辑