C++学习20:运算符重载
来源:互联网 发布:域名需要解析吗 编辑:程序博客网 时间:2024/06/05 16:31
推荐参考:
http://blog.csdn.net/zgl_dm/article/details/1767201
运算符重载是c++多态的一种形式,可以实现将运算符扩展到自定义的类型。
运算符实际是一种函数,先来看运算符函数格式:
<返回类型说明符> operator <运算符> (<参数列表>){ <函数体>}
对于运算符的重载分为两种:成员函数和友元函数(非成员函数,但与成员函数访问权限相同)。
来看一个例子,现在有一个Time类,其中sum函数就可以使用重载运算符+来替代。
class Time{ private: int Hour; int Minute; public: void setTime(int h, int m); Time sum(const Time&t) const; void showTime() const;};void Time::setTime(int h, int m){ Hour = h; Minute = m;}Time Time::sum(const Time&t) const{ Time sum; sum.Minute = Minute + t.Minute; sum.Hour = Hour + t.Hour + sum.Minute / 60; sum.Minute %= 60; return sum;};
下面来使用两种方法重载运算符+实现sum函数功能。
1.成员函数运算符
成员函数重载运算符形式和使用方法类似于成员函数,只是形式上有些不同:
<函数类型> operator <运算符> (<参数列表>){ <函数体>};
在类中声明成员函数:
Time operator+(const Time&t) const;
定义:
Time Time::operator+(const Time&t) const{ Time sum; sum.Minute = Minute + t.Minute; sum.Hour = Hour + t.Hour + sum.Minute / 60; sum.Minute %= 60; return sum;}
这样就可以直接使用+来实现sum功能了:
int main(){ Time one,two; one.setTime(2,40); two.setTime(5,55); Time result = one + two; result.showTime(); system("pause");}
结果如下:
8 hours, 35 minutes请按任意键继续. . .
这里的Time result = one + two;
实际可以转换为Time result = one.operator+(two);
2.友元函数运算符
友元函数形式如下,增加了friend关键字:
friend <函数类型> operator <运算符> (<参数列表>){ <函数体>};
在类中声明友元函数,注意+号是为二元运算符,需要两个参数:
friend Time operator+(const Time&t1, const Time&t2);
定义前是不需要写friend关键字的:
Time operator+(const Time&t1, const Time&t2){ Time sum; sum.Minute = t1.Minute + t2.Minute; sum.Hour = t1.Hour + t2.Hour + sum.Minute / 60; sum.Minute %= 60; return sum;};
这样可以实现和刚刚成员函数运算符相同的功能了,但是其实际运行时转换为函数调用形式应为:
Time result = operator+(one,two);
3.重载限制
1.重载后的运算符必须至少有一个操作数是用户定义的类型,这是为了防止用户为标准类型重载运算符。
2.使用运算符时不能违背原运算符的语法规则。
3.只能重载已有的运算符,不能创建新运算符。
4.并不是所有运算符都可以进行重载,无法重载以下运算符:
sizeof——sizeof运算符
.——成员运算符
.*——成员指针运算符
::——作用域解析运算符
?:——条件运算符
typeid——一个RTTI运算符
const_cast,dynamic_cast,reinterpret_cast,static_cast——强制类型转换运算符
5.可重载的运算符中,以下运算符只能使用成员函数进行重载:
()——函数调用运算符
=——赋值运算符
[]——下标运算符
->——通过指针访问类成员的运算符
6.运算符函数只有一个符号,不要随意将运算符定义为与其原始功能不相关的功能。
- 学习C++——运算符重载
- C++primer学习:重载运算符(3)
- C++primer学习:重载运算符(4)
- C++-运算符重载
- [C++]重载运算符
- C#:运算符重载
- c++-++运算符重载
- C++:重载运算符
- 运算符重载(C++)
- [c++]运算符重载
- 【C++】运算符重载
- C++--------------------------------------------运算符重载
- C#:运算符重载
- C++:运算符重载
- C++:运算符重载
- C#:运算符重载
- [C++]运算符重载
- 【c++】运算符重载
- Leetcode 63. Unique Paths II
- rabbitMQ消息服务器学习笔记(java)6 远程调用(RPC)
- PyTorch学习之路(level1)——训练一个图像分类模型
- 安装软件包的三种方法及RPM准备工作
- 1008. 数组元素循环右移问题 (20)
- C++学习20:运算符重载
- 数据结构顺序表基本流程
- 目标检测
- 对中科院的探讨,得出的结论
- Android 滑动与点击事件冲突的处理
- 三目运算符
- HCTF 2017 bin Level1 Evr_Q Writeup
- java PreparedStatement 中文异常
- 「Unity3D」(5)CanvasGroup功能和Fade动画