最近写算法多了,顺便也重新学习C和C++,发现以前咋没发现他俩的可爱和美好呢?人都是身在福中不知福的,看来。
这篇日志是关于C++的运算符重载和友元函数,主要是友元函数哈。(之前写java多,几乎忘记了有运算符重载这种东西了,更别提友元函数了)重新学习!
PS:java中是没有运算符重载的哈。我估计这是因为要实现运算符重载,在Java纯面向对象的概念中很难实现呢。呵呵。
运算符重载
先说说什么是运算符重载吧。其实就是将+ - * 这些运算符看成是函数,既然是函数,那就有重载的可能啦。格式是:返回类型 operator 操作符(参数列表)
友元函数
由于类的封装性质,类中的私有成员,在类外边的函数是无法访问的,然而为了某些编程需要,外边的函数要访问类里面的私有成员。C++提供了这种机制,就是友元函数。
场景就是上面说的运算符重载,看这个例子:
对时间Time类的乘法*运算符的重载可以通过定义一个类成员函数:Time operator *(double d)来实现。当表达式t=t1*2.5的时候,编译器就会调用t1.operator*(2.5)来完成运算。不过,如果表达式是t=2.5*t1呢?由于2.5在前面,并且并没有对2.5进行Time的类型转换函数的重载(这个以后会说),所以无法进行表达式的计算。但是事实上,t1*2.5跟2.5*t1结果是没有区别的,如果实现这两种表达式的兼容呢?
一种方法是再实现一个全局函数(我个人的理解)来完成,当然了,它需要两个参数,一个是double,一个是Time,像这样Time operator * (double d,TIme &t)。但是这个函数有一个问题是,作为非类成员函数,它无法访问类里面的私有成员数据,怎么办呢?友元出场!在函数的前面添加一个friend关键字,就可以搞掂。
下面是值得注意的几点:
1、参数为相同类型的二元运算符重载,事实上有两种方式,比如说Time的相加。一种是类成员函数Time operator+(&Time),另外一种就是使用友元函数:friend Time operator+(Time &t1,Time &t2)。可以选择二者之一,但不可以二者皆选,否则编译器会报错。
2、其实友元函数的实现可以使用非友元函数来实现,看回上面的例子,可以这样来实现一个全局函数:
Time operator * (double d,TIme &t){
return t*d;
}