运算符重载(一):基本介绍
含义
比如,我们给+进行重载后,我们的对象再使用+运算符,就不是使用编译器默认的+,而是我们重新设计后的+
语法
返回值 operate运算符(函数参数)
{
}
实例
class Person
{
private:int age;
public:friend operate<(Person& p1,Person& p2);Person(int _age):age{ _age }{}bool operate>(Person & p){return age>p.age;}
}
bool operate<(Person& p1,Person& p2)
{return p1.age<p2.age;
}
int main()
{Person p1(10);Person p2(50);std::cout<<( p1 <p2 );bool bcase=p1>p2;
}
类的非成员函数实现运算符重载
解释:这里的p1<p2相当于 operate<(p1.age,p2.age),这里可以不用友元,声明一个成员函数get来获取age是一样的
类的成员函数实现运算符重载
如上述代码,在类中实现了>的重载,这里p1>p2相当于p1.operate>(p2),p1和>是一体的,而p2只是它的参数
运算符重载的原则和时机
重载的意义
1.让类也支持原生的运算
2.提升对程序的控制权,比如重载new,delete,new[],delete[]
注意事项
1.不能自创运算符,只能重载运算符
2.以下运算符不能重载
2.1对象访问运算符.,即点
2.2,作用域解析运算符 ::,即两个冒号
2.3sizeof
2.4条件运算符?:即三目运算符
3.不能修改运算符本身的优先级和结合性,结合性指的是从左至右还是从右至左,比如加减就是从左至右,而赋值就是从右至左
4.C++17后不能修改计算的顺序,17之前可以对未定义行为进行计算顺序的修改
5.除了delete、new以外,不能对原生数据类型的运算符进行重载,比如int a的+不能定义为减
6.除了delete、new以外,其他的运算符关联的操作数不能修改,比如二元始终只能有两个参数
原则
1.不能修改运算符的原则,比如加法不能修改成减法
2.不建议修改逻辑运算符&&,||,取址运算符,逗号运算符
在C++17标准前,编译器可以自由决定先计算左操作数,还是先计算右操作数,17之后,都是从左至右计算
用法
如果一个运算符既能重载为全局函数,也能重载为成员函数,那么建议重载为成员函数,因为类的成员函数可以是虚函数
传递参数时,如果函数里面不修改这个参数,那么就要将它限定为const,参数能传递引用就不要传递值,因为值更加消耗内存,