C++ 为了实现链式赋值 a=b=c;为什么需要符号重载函数返回引用
4个回答
展开全部
引用&符号的用意都是为了绑定不同的”变量“,使它们指向同一块内存地址,从而保证操作的一致性,即对任何一个被绑定的变量作处理,那么被绑到同一块地址的另外一个变量也就进行了相同的处理。同时,也能避免重复开辟新的内存空间,减少资源的消耗。
比如你要重载 +=操作符,定义如下
class YourClass{
...
public:
YourClass & operator+=(const YourClass & param){
...
return *this;
}
}
在执行的时候是:
YourClass a,b;
//...初始化 a,b
a+=b;
符号运算的过程就相当于一个函数的调用,过程相当于a=(a.+=(b)),就是要保证符号重载函数调用者与调用完之后的那个返回变量指向同一块地址,即谁操作了重载函数,返回的还是它自身(同一块地址,没有另外开辟内存空间)。
比如你要重载 +=操作符,定义如下
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试一试的啊。
展开全部
因为赋值符号= 只适合基本内置类型,string是标准库类型需要重载赋值操作符。
比如你自己定义了一个类person,已有一个对象person1,重新定义一个person2,如果你没有重载赋值操作符,person1是不能直接赋值给person2的,即person2=person1是不对的。因为person2是你用户定义类型不是基本内置类型!
比如你自己定义了一个类person,已有一个对象person1,重新定义一个person2,如果你没有重载赋值操作符,person1是不能直接赋值给person2的,即person2=person1是不对的。因为person2是你用户定义类型不是基本内置类型!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
a=b=c 相当于 a=(b=c)
b=c这个操作是有返回值的 把这个返回值赋给a 这就是这个等式的含义
所以。。。
b=c这个操作是有返回值的 把这个返回值赋给a 这就是这个等式的含义
所以。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-10-05
展开全部
这只是个协议,没有强制性。你可以自定义的时候不这样做
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询