运算符重载 成员函数及友元函数
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的一个对象。接下来才是类成员。那么我们必须使用友元函数。
则在main()函数中使用
但是问题又出现了,如果我要在主函数中输出:
那么会出错,因为t2对应的<<左操作符不是ostream的对象了。所以怎么将
其中
所以就形成了我们经常使用的友元函数申明:
friend ostream & operator<<(ostream &os,const Time &t);
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);
相关文章推荐
- 关于Big Endian 和 Little Endian
- C++ Primer 5e chapter 13.2
- MongoDB学习六--MongoDB删除数据文档
- 洛谷1583 魔法照片 解题报告
- 第 6 章 Android SDK 版本与兼容
- bc #52 div 2 B || hdoj 5418 Victor and World(tsp问题,状压dp)
- Mahout安装与配置
- Mac快捷键
- MySQL日志管理
- Scala学习笔记--Map,Tuple,Zip总结
- Codeforces 570D TREE REQUESTS dfs序+树状数组 异或
- ***Tomcat7.0安装配置
- 对数据结构的认识
- 重载tostring()方法重要性
- 例题2.8 总是整数 LA4119
- Swift 那些二三事
- LintCode 岛屿的个数
- Java关键字(基础学习用到)
- mysql里的字符串类似split函数
- 2016阿里巴巴校招内推offer (by 伟伯)