3.1什么是运算符重载
为了实现两个Time类对象的加法运算,可以写出如下语句:
Time t1,t2;//定义时间类对象t1、t2 t1=Tadd(t1,t2);//调用函数Tadd()计算两个时间的和 //显然这种调用方式不直观,太繁琐 t1=t1+t2//使用运算符重载可以直接用加好来实现时间的加法运算
所谓重载,就是重新赋予新的含义。运算符重载是将系统中已有的运算符赋予不同的意义。使用运算符重载可以使C++的代码更直观、更易懂、更灵活,使得用户自定义的数据类型以一种更方便、更简洁的方式工作。
由于运算符也是函数,所以在用户自定义的类可以去重载这些函数。运算符重载的方法就是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。
运算符通常是对类中的私有成员进行操作,故重载运算符应能访问类中的私有成员,所以重载运算符一般采用成员函数或友元函数的形式。
3.2重载运算符的规则
- 重载运算符可以对运算符做出新的解释,但原有的基本语义不变。
- 不改变运算符的优先级和结合性。
- 不改变运算符所需要的操作数,即单目运算符只能重载为单目运算符,不能将单目运算符重载为双目运算符。
- 不能创建新的运算符,只有系统预定义的运算符才能被重载,除作用域操作符 :: 条件操作符 ? 点操作符 . 指向成员操作的指针操作符 ->*,.*预处理符号:#外 ,其他系统预定义的运算符都可以被重载。
- 重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数。
- 重载的运算符必须和用户自定义类型的对象一起使用,其参数至少应该有一个是类对象或类对象的引用。
- 用于类对象的运算符一般必须重载,但有两个例外,运算符 = 和 &,用户不必重载这两个运算符。
- 运算符重载函数可以是类的成员函数,也可以是类的友元函数。对于=、()、[] 和 ->,运算符只能用成员函数的方式进行重载,对于 << 和 >> 运算符必须用友元函数的方式进行重载。