重载运算符函数operator的返回值为什么总是声明为引用

例如Cat & opetator(const Cat &) 为什么都要用引用,一定要吗?不用可不可以?

我不久前正好遇到和你同样的问题,已经解决了,看了下面的你就会明白:(MyInt是类名)/**
* 重载+运算符(-,*,/,%与其相同)

* 这里应该是值返回,因为值返回会产生临时变量,临时变量与局部变量result的复制
会进入到拷贝构造函数中,重新拷贝一份,局部变量result在运行完拷贝构造函数后才
会被释放掉;
若返回引用,则不会产生临时变量,函数结束后不会进入到拷贝构造函数,而函数运
行结束后,result变量已经被释放,即返回值所引用的对象已经被释放,就会指向一个
无效的值,即结果错误。

@param temp 进行加运算的第二个操作符

@return 运算的结果
*/
MyInt operator +(const MyInt& temp) const {
cout<<"+运算符的重载"<<endl;
MyInt result;
result.a=a+temp.a;
result.b=b+temp.b;

return result;
}

/**
* 重载+=运算符(-=,*=,/=,%=与其相同)

* 这里值返回和引用返回都可以得到正确的结果。而返回引用不用产生临时变量,所以
效率更高。注意的一点就是:
在函数中,若this本身会发生改变,则应该返回引用,因为this不会被销毁,即返回值所
指向的内存区域是正确的。
若this不会发生变化,需要创建一个局部变量result来保存结果值,因为局部变量最终会
在函数运行结束后释放掉,所以必须调用拷贝构造函数,完成值返回所产生的临时变量
与result的拷贝。

@param iSep 增加的值

@return 运算的结果
*/
MyInt& operator +=(int iSep){
a+=iSep;
b+=iSep;
cout<<"+=运算符的重载"<<endl;

return *this;
}

/**
* 前递增(--同)

* 直接增加,应该返回引用,理由同+=

@return 已经改变的对象的引用
*/
MyInt& operator ++(){
++a;
++b;
cout<<"前递增++运算符的重载"<<endl;

return *this;
}
/**
* 后递增(--同),用参数int来代表是后递增

* 先调用拷贝构造函数拷贝当前对象,作为最后的返回值。然后直接增加当前对象,应
该返回值,因为返回的是局部变量的拷贝。

@return 已经改变的对象的引用
*/
MyInt operator ++(int){
cout<<"后递增++运算符的重载"<<endl;
MyInt org(*this);
++a;
++b;

return org;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-21
引用表示返回的还是对象本身
并且传入参数的时候不做对象赋值
比如i++
返回的其实还是i
只是在函数内部把i+1了 并没有生成新的对象

为什么c++ 重载输出运算符的时候要取地址 ostream &operator<<?
&不表示取地址,而表示引用。由于ostream对象不可复制,因此无论是作为参数传入,还是作为返回值传出,都必须使用引用形式。即ostream& operator<<(ostream&, MyClass)的定义方式是正确的,而ostream operator<<(ostream, MyClass)的定义方式是错误的。

C++重载=,+=等时候为什么要用返回引用
为什么要返回引用,我说你仔细想一下就明白了,你的函数会修改你操作的流,而流是全局的,不是临时变量,是系统托管的。如果不返回引用,后面对流的操作就是无效的了,因为你返回的只是某时流的一个拷备,以后对它的操作不会显示出来了。就像上面为什么我可以连用两次<<操作符?如果不是返回引用,第...

C++运算符重载,+-*\/的重载,返回值为什么是对象而不是对象的引用?而流操...
分析不能用引用的原因: 函数传入了两个参数a,b,并且+只能传入两个参数(c++不允许自己创造运算符),这样就限定了和sum不能作为参数传入,所以sum只能是一个函数里的临时变量,但是临时变量在函数结束时是要销毁的,那么函数调用玩,sum就没有了, 如果返回引用,引用源都已经没有了,还怎么引用,...

运算符重载 &,有些时候函数声明在operator前有&……有时候没有……为 ...
第一是需求, 有些情况语法要求必须返回引用 比如重载=操作符, 返回引用才可写出 a1=a2=a3这样的语句 再如[]操作符, 返回引用才能实现这样的语句: a[0]=1;第二是效率问题:很多情况是不需要返回引用的, 比如双目的+, 可以是返回一个对象的副本, 但是返回引用比返回对象的副本效率要高, 因为返回...

在C++中运算符重载的时候究竟什么时候应该加引用,什么时候不应该加引...
如果返回值会被赋值,就必须返回引用,例如=重载\\x0d\\x0a如果返回值是一个局部变量,就一定不能返回引用,例如+重载\\x0d\\x0a如果为了提高效率,参数可以使用引用,\\x0d\\x0a而[]的实际参数经常是一个常量,常量你是无法引用,所以不能用引用作为[]的参数。

c++中的重载运算符<<和>>为什么是只可以为友元函数,不可是成员函数?我...
左侧运算量是 cin或cout 而不是对象本身,所以不满足后面一点。。。就只能申明为友元函数了。。。如果一定要声明为成员函数,只能成为如下的形式:ostream & operator<<(ostream &output){ return output;} 所以在运用这个<<运算符时就变为这种形式了:data<<cout;不合符人的习惯。

C++中运算符重载问题,分别说明下面const的作用以及为什么要用引用
一般情况下,函数的返回值为某个对象时,如果将其声明为const时,多用于操作符的重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。原因如下:如果返回值为某个对象为const(const A test = A 实例)或某个对象的引用为const(const A& test = A实例) ,则返回值...

运算符重载的参数为什么必须要类?
编译因不支持对象运算而报错。为了让编译器在遇到对象运算时能按我们要求的进行运算,这就是运算符重载的意义,即重定义运算符,因此你可以看到,运算符重载就是为类对象服务的,那么两个对象的成员进行运算那必须先获得对象本身啦,所以运算符重载参数必须含有类指针或引用,这是主要客户。

为什么输出运算符重载不能是一个成员函数?而非得声明为友元?
因为,输出运算符重载函数的第一个形参必须是ostream或istream类型,而成员函数的第一个形参是默认的(即this指针)。

为什么operator lt;lt;运算符重载,需要定义为friend函数
友元函数有两种,一种不属于任何类的,这种其实和c的外部函数一样属于全局函数!一种是其他某个类的成员函数!只有全局性质的友元函数才会直接定义在类的内部!友元函数虽然不是类的成员函数,却是类的接口!和类关系密切,所以可以定义在类的内部!

相似回答