您的位置:首页 > 其它

运算符重载 成员函数及友元函数

2015-08-22 23:09 337 查看
c++多态分为静态多态和动态多态。资料上显示静态多态通过模块和函数重载来实现的,动态多态是通过继承、虚函数、指针来实现的。

1.首先我们看一看函数重载,它旨在用同名函数来完成相同的基本操作,即使这种操作被用于不同的数据类型。运算符重载是将重载的概念扩展到运算符上。当运算符重载为类的成员函数时,函数的参数个数比原来的少一,因为第一个参数默认为this指针隐式传递。

Time operator+(Time &t);

等价于*this+t;

2.在提出友元函数前,我们会发现有时候第一个参数是非类对象时,重载为成员函数的重载并不适用了。重载友元函数没有隐退的参数this,,操作数都由参数来传递了,这样函数的参数就等同于运算符参数格数了。但是注意有一些并不能重载为友元函数:=,(),->.

第一步:将其原型放在类声明中,并且不要忘记关键字friend.

friend Time operator*(double m,const Time &t);

注意:它不是成员函数,但它与成员函数有相同的访问权限。比如可以访问类对象的私有部分。

第二步:函数定义的编写,因为它不是成员函数,所以不要用class::限定符。也不要在定义中使用关键字friend。

举例常见的友元:重载<<运算符

使用输出操作时,我们知道第一个操作是cout,ostream的一个对象。接下来才是类成员。那么我们必须使用友元函数。

void operator<<(ostream &os,const Time &t)

{

os<<t.hours<<t.minutes<<endl;

}


则在main()函数中使用
cout<<t;


但是问题又出现了,如果我要在主函数中输出:
cout<<t1<<t2;


那么会出错,因为t2对应的<<左操作符不是ostream的对象了。所以怎么将
<<t2
左边也是ostream的一个对象呢。因此,将operator<<()函数实现为返回一个指向ostream对象的引用。这样
(cout<<t1)
运行后就表示ostream对象cout。

其中
cout<<t1
调用友元函数就是opreator(cout的引用,t1),返回cout的引用(即别名).

所以就形成了我们经常使用的友元函数申明:

friend ostream & operator<<(ostream &os,const Time &t);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: