运算符重载
对于运算符的重载,主要有两种方式:友元和成员函数
@表示某一种操作符。
以下有+ - * / >> << 的用法,其他没有。
对于 + - * / 的重载
在这四个例子中,我串入两种重载方法的使用。
以复数作为例子,定义实部和虚部两个数据成员。没有学复数的读者可以认为就是两个float变量,后面只是一些计算。
友元方法的声明: + * 举例
1 | friend Complex operator+(Complex &,Complex &);/// + |
定义:
1 | Complex operator+(Complex &a,Complex &b) /// + |
使用:
1 | Complex a,b; |
对于friend Complex operator+(Complex &,Complex &);
,我们忽略掉friend和&简化得到Complex operator+(Complex,Complex;。可以看成是有两个参数的一个函数,返回类Complex。
第一个Complex你可以看成是int,void这样的返回类型,不过这是类,不是基础数据类型。
用友元的方法,看上去比较整洁,是几目运算符,形参就有几个。
定义的时候,在声明的基础上去掉friend。
成员函数方法的声明: - / 举例
1 | Complex operator-(const Complex &b);/// - |
定义:
1 | Complex Complex::operator-(const Complex &b) |
声明:对于Complex Complex::operator-(const Complex &b),
定义的时候,因为是成员函数,所有要遵循类函数定义规则。先是返回类型,然后接类名::,然后是operator@,n目运算符,后参数为n-1.
定义:在定义中,肯定有人发现了这个,this,之前我也被这个整蒙了,在这里你只需要知道,它就相当与友元当中a就完了。this->r,this>i分别表示a.r,a.i。不过还是要说明的是,参数带了个&,表示的是引用(我是理解为C里面的指针的),对于指针,那就是用箭头了啊。用.的情况我只在学Java见识过。
对于输入输出>>和<<的重载方法:
在类CommEntry中有两个私有数据成员name和tel,分别是电话(string)和姓名(string)
在类中声明:
1 | friend ostream& operator<<(ostream&, CommEntry&); |
对于函数的实现:
1 | istream& operator>>(istream& in,CommEntry& c ) |
调用:
1 | CommEntry c1; |
自己的想法:
我们忽略friend和&,那么就变成了 istream operator<<(istream in, CommEntry c);
第一部分:对于第一个出现的istream来说,其实就是返回类型,和成员函数的声明一个意思,相当于写了个void或者int。
第二部分:之后是固定的写法,operator@。
第三部分:在括号中是两个形参,我觉得可以把istream可以int一样的东西,不过是一个类对象。然后接一个名字,后面是类对象加名字,记得两个都是引用,需要加上&。
注意,所有的都是引用,前面有个&,look到没~(不能理解什么是引用?你可以比作是c里面的指针)
经验和教训:
1.我们只能以自定义类的友元函数的形式重载这两个运算符
2.对于输入,形参必须为非 const,因为输入操作符的目的是将数据读到这个对象中。
3.在类声明和定义文件中不需要#include<iostream>,写了也没有什么关系。
为了方便理解,我把全部的代码发了!
读者自己创建三个文件,运行理解一下
1 | ///main.cpp |
1 | ///main.cpp ///主文件 |
如有错误,还请指出~