C++ 为了实现链式赋值 a=b=c;为什么需要符号重载函数返回引用

rt
String & operator =(const String &str);//赋值函数

引用&符号的用意都是为了绑定不同的”变量“,使它们指向同一块内存地址,从而保证操作的一致性,即对任何一个被绑定的变量作处理,那么被绑到同一块地址的另外一个变量也就进行了相同的处理。同时,也能避免重复开辟新的内存空间,减少资源的消耗。

比如你要重载 +=操作符,定义如下
class YourClass{
...
public:
YourClass & operator+=(const YourClass & param){
...
return *this;
}
}
在执行的时候是:
YourClass a,b;
//...初始化 a,b
a+=b;
符号运算的过程就相当于一个函数的调用,过程相当于a=(a.+=(b)),就是要保证符号重载函数调用者与调用完之后的那个返回变量指向同一块地址,即谁操作了重载函数,返回的还是它自身(同一块地址,没有另外开辟内存空间)。追问

String& String::operator =(const String &str){
int length=strlen(str.m_data);
delete [] m_data;
m_data= new char[length+1];
strcpy(m_data,str.m_data);
return *this;//返回本对象的引用
}
当我把&去掉之后 有什么变化吗?

追答

我看到的例子说在对符号进行重载的时候必须以应用的形式返回,你会发现很多库函数都是这么返回的。如果你要把&去掉,那么也把“return *this;”的“*”去掉,再用debug单步调试,查看想内存中的数据或者看看有没有错就知道了。如果这是重载规定的标准写法,那就时能问设计编译器的人了,因为像这样的东西,往往只是个标准,而不是个规律,这样就只能这么写咯。

我觉得这个原因就是避免重复开辟内存,提高执行效率,减少内存空间(如果自定义的对象比较大的话不以引用的形式返回,那么就要额外再开辟空间,然后赋给调用方法的对象变量)。

具体什么变化你可以写个简单的例子,debug试一试的啊。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-10-05
因为赋值符号= 只适合基本内置类型,string是标准库类型需要重载赋值操作符。
比如你自己定义了一个类person,已有一个对象person1,重新定义一个person2,如果你没有重载赋值操作符,person1是不能直接赋值给person2的,即person2=person1是不对的。因为person2是你用户定义类型不是基本内置类型!
第2个回答  2013-10-05
a=b=c 相当于 a=(b=c)
b=c这个操作是有返回值的 把这个返回值赋给a 这就是这个等式的含义

所以。。。
第3个回答  2013-10-05
这只是个协议,没有强制性。你可以自定义的时候不这样做

C++ 为了实现链式赋值 a=b=c;为什么需要符号重载函数返回引用
a+=b;符号运算的过程就相当于一个函数的调用,过程相当于a=(a.+=(b)),就是要保证符号重载函数调用者与调用完之后的那个返回变量指向同一块地址,即谁操作了重载函数,返回的还是它自身(同一块地址,没有另外开辟内存空间)。

...c++中,const int a=1; 与 int const a=1;有什么区别?
函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。例如:class A { A & operate = (const A &other); \/\/ 赋值函数 };A a, b, c; \/\/ a, b, c 为A 的对象 a = b = c; \/\/ 正常的链式赋值 (a = b) = c; \/\/ 不正常的...

适合初学者的c++视频教程
提取码: rwyi 复制这段内容后打开百度网盘手机App,操作更方便哦 若资源有问题欢迎追问~

Java的const怎么用
对于赋值函数,应当用“引用传递”的方式返回String对象。如果用“值传递”的方式,虽然功能仍然正确,但由于return语句要把 *this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,降低了赋值函数的效率。例如:String a,b,c;…a = b; \/\/ 如果用“值传递”,将产生一次 *this 拷贝 a = ...

Java如何实现const
对于赋值函数,应当用“引用传递”的方式返回String对象。如果用“值传递”的方式,虽然功能仍然正确,但由于return语句要把 *this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,降低了赋值函数的效率。例如:String a,b,c;…a = b; \/\/ 如果用“值传递”,将产生一次 *this 拷贝 a = ...

相似回答