> 文章列表 > 运算符重载(一):基本介绍

运算符重载(一):基本介绍

运算符重载(一):基本介绍

含义

比如,我们给+进行重载后,我们的对象再使用+运算符,就不是使用编译器默认的+,而是我们重新设计后的+

语法

返回值  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,参数能传递引用就不要传递值,因为值更加消耗内存,