运算符重载

内容:运算符重载

整理:CmdHack

时间:20102323:54:50

 

一:关于”+”

Int a , int b

a+ b 之后a,b的值都不改变

所以定义类class String

定义对象:String str1 ,str2

完成str1+str2 应该它们里边的数据成员的内容都不发生改变

所以

Mystring Mystring::operator+ ( Mystring obj)

{

       Mystring Temp(*this);

 

       Temp.CatString(obj);

       return Temp;

}

用临时对象类类储存  然后修改这个临时对象  最后一个拷贝构造过程

 

这样美中不足的是 只能满足以下两种情况

Str1+str2 str1+”Dong” (“Dong”会参与有参构造产生一个无名对象)

而不能满足”Dong” + str1 

所以再设计的时候还需要一个全局函数以满足该类型的匹配

原型如下(设计很巧妙)

Mystring operator+ ( const char* Str, Mystring obj)

{     

       return Mystring(Str) + obj;

}

然后将该全局函数添加为类的友元

(哪怕该函数只调用类的Public数据成员和成员函数 也写成类的友元比较好  完没封装

 

写“+”的重载函数的时候需要注意的有

1:“+”左右的对象不改变(临时对象来代替,而且整个过程会产生一个无名对象(有参构造)和 拷贝构造过程)

2:关于第一点特别要注意的是 返回值是类 而不是类的引用

3:为了满足基本数据类型在左 对象类型在右 这种情况

   需要一个全局函数(两参数 基本在左) 然后添加为类的友元

关于第2 为什么返回类类型而不是类的引用类型?

1:如果返回值是*this那么”+”左值发生改变  不符合要求

  如果返回临时对象的引用  但是临时对象出了函数就会调用析构函数

  所以更不满足要求了, 所以“+“的返回值是类类型   这个就成了约定俗成的东西

  当然也是最正确的

 

/////////////////////////////////////////////////未完待续//////////////////////////////////////////

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值