C++之运算符重载
先举例子:例如、’*'既可以用于整数之间的乘法运算,同时还可以用于 指针以得到 指针所指向的值。
函数有函数重载和函数多态,运算符重载是一种形式的C++多态。
运算符重载的特殊格式
operatorop(argument-list)
表明要重载(operator)加上要重载的运算符(op)以及参数列表(argument-list)
例如:operator+() 重载’+'运算符;
注意:运算符必须是 有效的C++运算符,不能 虚构一个新的符号;比如operator@()这样的函数
一个运算符重载实例
现在的情形是如果要将时间相加,比如两1小时30分钟 相加 会得到3小时,这种情况 与加法相似但是 要操作的对象与C++内置数据类型不符,使用 类解决的一般方法是创建一个可以使两个时间对象的各部分相加的成员函数,而使用运算符重载也非常简单,只需要将实现对象相加的成员函数的函数头变为运算符重载的函数头形式就可以了。
```c++
//time.h
#pragma once
#ifndef _TIME_
#define _TIME_
class time {
private:
int hours;
int minutes;
public:
time();
time(int h, int m = 0);
time Sum(const time& t)const;
没有运算符重载之前要想计算两个此类对
象之间对应数据的和,就需要调用函数以及传递参数来实现
time operator+(const time& t)const;
添加重载之后在该类对象之间直接
使用的加法运算符
void Show()const;
};
#endif // !_TIME_
```c++
//time.cpp
#include<iostream>
#include"time.h"
time::time() {
hours = minutes = 0;
}
time::time(int h, int m) {
hours = h;
minutes = m;
}
time time::Sum(const time& t)const {
time sum;
sum.minutes = minutes + t.minutes;
sum.hours = hours + t.hours + sum.minutes / 60;
sum.minutes %= 60;
return sum;
}
time time::operator+(const time& t)const {针对此类对象的加法运算符的
重载的代码与Sum的具体代码是一样的,只是这样以后加法可以直接在两个此类对象之间
使用了
time sum;
sum.minutes = minutes + t.minutes;
sum.hour`在这里插入代码片`s = hours + t.hours + sum.minutes / 60;
sum.minutes %= 60;
return sum;
}
void time::Show()const {
std::cout << hours << "hours," << minutes << "minutes";
}
```c++
#include<iostream>
#include"time.h"
using namespace std;
int main() {
time time0(1,2),time1(2,3),time3;
time3 = time0 + time1;运算符左侧的对象相当于调用该运算方法的对象,
而运算符右侧的对象是作为参数被传递的对象,相当于time0.operator+(time1)
最后将计算的结果保存到局部对象中,并且在局部对象消失之前返回该对象的副本。
time3.Show();
}
使用运算符重载的过程中要注意运算符重载的限制
1、重载后的运算符必须至少有一个操作数是用户定义的类型,这样是为了防止用户为标准类型重载运算符,因此不能将减法运算符重载为计算两个double值的和,而不是它们的差。
2、使用运算符重载时不能违反运算符原来的语法规则。例如:不能将求模运算符重载为使用一个操作数int x ;time time1;%x;%time1。
同样的不能修改运算符的优先级。
3、不能创建新的运算符。比如不能使用operator++()。
4、不能重载下面的运算符:
- sizeof:sizeof运算符。
- .:成员运算符。
- .*:成员指针运算符。
- :::作用域解析运算符。
- ?::条件运算符。
- typeid:一个RTTI运算符。
- const_cast:强制类型转换运算符。
- dynamic_cast:强制类型转换运算符。
- reinterpret_cast:强制类型转换运算符。
- static_cast:强制类型转换符。
5、有些运算符只能通过成员函数进行重载:
- =:赋值运算符。
- ():函数调用运算符。
- []:下标运算符。
- ->:通过指针访问成员的运算符。…
运算符。
- static_cast:强制类型转换符。
5、有些运算符只能通过成员函数进行重载:
- =:赋值运算符。
- ():函数调用运算符。
- []:下标运算符。
- ->:通过指针访问成员的运算符。…
以上自学所得,不足之处,万万谅解!共同进步