C++操作符重载的一个问题

来源:百度知道 编辑:UC知道 时间:2024/09/22 09:58:09
class CInnerClass {
public :
CInnerClass( int id):m_iID(id) {}
CInnerClass& operator = ( const CInnerClass& rb) {

//这个操作符重载不懂..参数取地址是想多态吗? 返回类值 CInnerClass& ??

m_iID = rb.m_iID;
return * this ; //指向指针的指针?
}
private :
int m_iID;
};

上面那段代表..不懂啊,
谁能解释下?

这个表示返回一个引用。

返回引用的主要好处是结果可以做左值。 如果按值返回就相当于返回到一个临时变量,虽然也可以做左值,但给临时变量赋值显然是没什么意义的。

比较一下两种情况下这个语句的差别( a=b)=c ,其中a,b, c都是ClnnerClass的对象。 在返回引用的情况下,这相当于连续两句赋值 a=b;a=c;而在返回值的情况下 这相当于三句赋值: a=b; temp=a; temp=c; 所以如果你打印a的结果,就可以看出两种情况下的差别。(前者相当于a=c 后者相当于a=b)

关于拷贝代价的问题,其实这个不是主要理由。 编程首先要确保尽可能全面的意义正确,然后才涉及到性能问题。 在意义正确的前提下,可能的选择并不多。

上面我也没有说到为什么要确保=的返回值是合格的左值,这主要是因为运算符重载有一个原则:就是尽可能模仿内置类型的运算符的行为(关于这一点《Effective C++》的某一节有提到)。而内置类型的赋值是跟传引用的行为一致的。当然如果你确信这个类不会进行什么复杂的应用(复杂到可以体现出传值和传引用在语义上的差别), 完全可以直接返回值。 额外的拷贝开销多半会被编译器优化掉

首先我得说一下前面这位的说法有点欠妥 ,
引用不是指针哈 ! ,引用用起来和 针很像 ,作用也和指针差不多 !引用是别名 ,
你的问题我觉得在你对函数认识还不够 !
我们把函数写成这样
int &returnValue functionTest(int arg0, char arg1)
{
int rtn=0;
//一些处理代码,在这之间给 rtn重新赋值
return rtn;
}
这的意思就是我们把局部变量rtn "赋值"给了全局的 returnValue ,这里的 "赋值 "实际上是赋引用 ,也就是作别名 ,给 rtn取了另一个名字 .
你可能早就已经发现我的阴谋了函数名前面应该只有类型 ,不应该有变量名 ,好好 ,我承认这一点(它是语法 ,是完全正确的) .现在我们假设放了名