内容:运算符重载
整理:CmdHack
时间:2010年2月3日23: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那么”+”左值发生改变 不符合要求
如果返回临时对象的引用 但是临时对象出了函数就会调用析构函数
所以更不满足要求了, 所以“+“的返回值是类类型 这个就成了约定俗成的东西
当然也是最正确的
/////////////////////////////////////////////////未完待续//////////////////////////////////////////
8万+

被折叠的 条评论
为什么被折叠?



