C++ 函数返回引用

检举|2010-11-6 17:31

提问者: wxhazso  |浏览次数:1501

我是C++的初学者,对函数返回引用有很多疑问。请问一般什么情况下会用到返回引用呢?运算符重载时返回引用只是为了能实现链式应用吗?前++重载和后++重载为什么一个返回引用而另一个不返回引用呢?为什么我重载前++时去了引用好像也可以?前++可以做左值时怎么回事?请各位高手多多指教

问题补充:

二楼的朋友似乎没有看清我的问题,我的意思不是说函数返回值,而是指函数返回类型为引用类型,比如

int& cal(int& a,int& b{};,我想知道的是一般什么情况下需要在返回类型后加引用

我来帮他解答

 

检举|2010-11-6 18:10

满意回答

1+2是啊,你说的链式应用我觉得有些夸张就是连续运用操作符号,比如你用加法操作符return一个类类型数据,但是你用想使用这个被加后产生的类的成员x,如果你不引用就是a=b+c;a.x,但是如果你引用了就可以(b+c).x,只是因为如果你只是返还一个值,那么它只会在栈区开辟一块数据地址存放零时对象的值,然后把这个临时对象的值用复制构造函数复制给b,但是你却不能用它,但是引用是传地址所以可以用它,有个例子很鲜明能浅显说明这种区别:a=3,如果我用3+1,这里的3就值传递情况下的b+c显然是没有意义;但是我用a+1就是用意义的,a就是3这个地址的引用,你改变它下面的值是用意义的,只能说这么多,有些东西还要自己想;

3,更简单,++a,如果你引用了就是返回了a的地址,此时a已经加1,完全可以,但是如果是a++,你返还的是a1之前的数值,换句话说此时a已经不是a,而是a+1,但是你如果引用,那么又是它的地址,而地址下是a+1,那么后++就和前++没有任何区别,这样做是没有意义的,能明白吗?

4,你去了当然有用,看你怎么用了,引用不是强迫你用,但是要看你想实现什么功能,举++的例子,你定义函数时必定起传地址,但是如果你返还不传引用而是传值,那么你想(++a++,有意义吗?很显然没,应为括号里的++a是常量,这就和3+1一样;

5,看了上面的东西,如果你理解了,这个问题就不是问题了,还是地址的问题

 

 

关于前自增和后自增的重载  

2009-10-15 15:32:31|  分类: C++语法|字号 订阅

        在大二暑假的时候学习运算符重载,没学会自增运算符的后自增如何重载。后来从googlecache中扒拉下如下东西,觉得简单易懂,希望对别人也有用。
       很久以前(八十年代),没有办法区分++--操作符的前缀与后缀调用。这个问题遭到程序员的报怨,于是C++语言得到了扩展,允许重载increment 和 decrement操作符的两种形式。 然而有一个句法上的问题,重载函数间的区别决定于它们的参数类型上的差异,但是不论是incrementdecrement的前缀还是后缀都只有一个参数。为了解决这个语言问题,C++规定后缀形式有一个int类型参数,当函数被调用时,编译器传递一个0做为int参数的值给该函数。

#include "stdafx.h"
 #include "assert.h"

 class A
 {
 public:
     A(int i)
         :m_i(i)
     {
     }

     // ++i
     A& operator++()
     {
         ++m_i;
         return *this;
     }

     // i++
     const A operator++(int)
     {
         A tmp = *this;
         ++(*this);    // Implemented by prefix increment
         return A(tmp);
     }
     int m_i;
 };

 int main(int argc, char* argv[])
 {
     int i = 0;
     int i1 = i++;   // i1 = 0; i = 1;
     int i2 = ++i;   // i2 = 2; i = 1;
     //i++++;  //avoid
     //++++i;  //suport

     A a(0);
     A a1 = a++;     // i1 = 0; i = 1;
     A a2 = ++a;     // i2 = 2; i = 1;
     
    // a++++; //avoid
    // ++++a; //support

     assert(i1 == a1.m_i);
     assert(i2 == a2.m_i);
     return 0;
 }

说明

1. 类中的++操作符号重载之后必须保证其语意与全局++相同。

2.为了区分前后,用++()表示前自增,用++(int)自增。

3.因为按照前自增的标准定义,应该支持"++++a"的语法,而且两次前自增都应该是对a对象的自身操作,如果返回A类型,那第二次前自增调用的是临时对象的前自增操作。
4.自增应该返回"const Complex".这可以防止形如"a++++"的用法。

5.一般通过前自增操作来实现后自增操作符函数。