运算符重载

来源:互联网 发布: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
原创粉丝点击