C++ 运算符重载
来源:互联网 发布:周春芽绿狗 知乎 编辑:程序博客网 时间:2024/06/05 19:10
一,运算符重载
运算符重载是一种静态的C++多态,C++允许将运算符扩展到用户定义的类型,例如:可以把两个对象相加。编译器将根据操作数的数目以及类型来决定使用哪种加法定义,重载使代码看起来更加的自然。
二,运算符重载实例
定义一个与时间相关的类Time
class Time{private: int hours; int minutes;public: Time():hours(0), minutes(0){}; Time(int h, int m):hours(h), minutes(m){} Time operator+(const Time &t) const; friend ostream & operator<<(ostream &os, const Time &t);};Time Time::operator+(const Time &t) const{ Time sum; sum.minutes = minutes + t.minutes; sum.hours = hours + t.hours + sum.minutes / 60; sum.minutes = sum.minutes % 60; return sum;}ostream & operator<<(ostream &os, const Time &t){ os<<t.hours<<" "<<t.minutes<<endl; return os;}int main(){ Time t1(1, 20); Time t2(1, 20); Time sum = t1 + t2; cout<<sum; return 0;}输出结果
2 40Process returned 0 (0x0) execution time : 0.010 sPress any key to continue.
operator+()函数的名称使得可以使用函数表示法或运算符表示法来调用。
下面这两种方式的计算结果是一样的:
Time sum = t1.operator+(t2);Time sum = t1 + t2;
三,运算符重载的限制
1,重载后的运算符必须至少有一个是用户自定义类型,这将防止用户为标准类型重载运算符。
2,使用运算符时不能违反运算符原来的语法规则(操作数个数、优先级、结合性)。
3,不能重载下面的运算符
(1),sizeof 运算符。
(2),. 成员运算符。
(3),:: 作用域解析运算符。
(4),?: 条件运算符。
(5),typeid 一个RTTI运算符。
(6),四种类型转换运算符。
4,大多数的运算符可以通过成员或非成员函数进行重载,但是下面的运算符只能通过成员函数进行重载。
(1), = 赋值运算符。
(2),() 函数调用运算符。
(3),[] 下标运算符。
(4),-> 通过指针访问类成员运算符。
四,重载运算符作为成员函数的局限性
把运算符重载为类的成员函数,运算符左侧的操作数是调用对象,因此,运算符的第一个操作数必须是类对象。因为,重载运算符作为成员函数,当对象调用这个函数时,一个参数通过this指针隐式传递。例如:
Time operator+(const Time &t) const;
加法运算符需要两个操作数,上面operator+的参数只有一个,其中的一个操作数是被隐式传递的调用对象。
五,运算符重载与函数重载
1,函数重载
C++允许功能相近的函数,在相同的作用域内以相同函数名声明,从而形成函数重载。
2,运算符重载
运算符重载是对已有的运算符赋予更多的含义。C++预定义的运算符只能用于基本类型数据,不能用于自定义类型数据。编译器对重载运算符的选择,遵循函数重载的原则。运算符重载的实质就是函数重载。
- C++-运算符重载
- [C++]重载运算符
- C#:运算符重载
- c++-++运算符重载
- C++:重载运算符
- 运算符重载(C++)
- [c++]运算符重载
- 【C++】运算符重载
- C++--------------------------------------------运算符重载
- C#:运算符重载
- C++:运算符重载
- C++:运算符重载
- C#:运算符重载
- [C++]运算符重载
- 【c++】运算符重载
- C++:运算符重载
- C#:运算符重载
- C++:运算符重载
- Error:Execution failed for task ':app:resolveDebugDependencies'. > Could not initialize class com.an
- 一个demo让你彻底搞懂观察者模式
- 如何删除C++容器中的值
- 小波的秘密9_图像处理应用:图像增强
- PHP获取今日、本周、本月、本年初始(凌晨)时间戳的方法
- C++ 运算符重载
- Linux 改写rm命令,让删除编程备份
- ESB v6.5.1,ESB Server MQ服务启动失败--启动报java.net.UnknownHostException: bogon: bogon
- lintcode(247)线段树查询 II
- genymotion安卓模拟器
- win7x64编译poco
- 排队接水
- 小波的秘密10_图像处理应用:图像增强
- 原创超清的 Webpack2 视频教程