运算符重载
来源:互联网 发布:js获取微信用户openid 编辑:程序博客网 时间:2024/06/10 09:06
Person& operator+(int n){this->num1+=n;}此为运算符重载的例子,这里实现的是num1与n的和。注意返回值,实际上返回值可以为Person、Person&、int。
区别:返回引用Person&可以少一次构造
返回 Person也是可以的,但是返回的是新的Person对象,调用时会新构建一个Person对象,用引用就不会了,主要是效率上的考虑的话最好返回Person&。
而返回int也是可以的,但是区别就是用法不一样了,比如:
如果返回的是对象
Person p=op+100;如果返回intint val=op+100;
常出错总结:
(1) 定义与返回
(一)Person& operator+(int n){this->num1+=n;return *this;}
这样的定义可直接使用,
(二)friend Person& operator+(int n, const Person& p){<pre name="code" class="html">//Person& t=*new Person();Person *t = new Person();t->num1 = n + p.num1;return *t;}这样的定义则需要首先声明,因为其参数中用了Person& p,声明如下:
class Person;Person& operator+(int n, const Person& p);(2)(二)中用了友元函数,这样就可访问参数p的私有成员;t 的定义有两种:
1)Person& t=*new Person(); 2)Person *t = new Person();这两种都可以,一种是定义为取地址,一种定义为指针。
(3)注意:对于(一),调用时可以采用
p1 = 5+p1; 或者p1+5;
因为定义中采用的是this+可直接使用p1+5;
(4)针对一二两种情形,(一)中使用this->num1直接访问了成员函数,因此它必须定义为成员函数;
而(二)中是将p作为显示参数来传递,因此要定义为友元函数;
由上可知:非成员版本的重载运算符函数所需的形参数目与运算符使用的操作数数目相同;
而成员版本所需的参数数目少一个,因为其中的一个操作数是被隐式地传递的调用对象。
(二)中调用时只能使用赋值保存。因为定义时采用t->num1 = n + p.num1;否则将无法实现重载运算。
p1 = 5 + p1;因此,调用时必须与定义时相一致。
重载<<运算符:
两种方式:
void operator<<(ostream &os, const Time& t){os<<t.hours<<" hours, "<<t.minuts<<" minuts. ";}ostream& operator<<(ostream &os, const Time& t){os<<t.hours<<" hours, "<<t.minuts<<" minuts. ";return os;}
注意,第二种返回ostream类型,因此可连续输出。
举例:
cout << "Trip time: " << trip << " (Tuesday)\n";
第一种不可以,第二种可以正确输出。
0 0
- 运算符重载 [++,--,+,<<; &&,||(不可重载)]
- 重载之运算符重载
- 重载赋值运算符
- C++运算符重载
- 运算符重载
- 运算符重载总结
- 运算符重载例子
- 运算符重载
- 运算符重载
- 基础:运算符重载
- 运算符重载
- 运算符重载
- 重载赋值运算符
- C#运算符重载
- C++-运算符重载
- 重载赋值运算符
- 运算符重载
- 有关运算符重载
- Android Selector 与 Shape 基本用法
- iOS上传图片
- 数据库中树结构数据,转换为Java对象树结构( 多叉树结构 )
- WPF 查找子控件和父控件
- firebug/firediff /SELENIUM IDE
- 运算符重载
- http://blog.csdn.net/hackbuteer1/article/details/6706562 char str[] 和 char *str 的区别
- [c.y.j]java多线程讲解的博客
- MooseFS源代码分析(一)——基础介绍
- ABBYY FineReader安装须知
- 水平滚动字幕的jquery插件和原生代码
- MooseFS源代码分析(二)——mfsmount模块
- MooseFS源代码分析(三)——mfsmaster模块
- 第十四章_安全性