来源:远方网络 | 2006-1-6 | (有2227人读过)
最后的一种情况是函数返回引用,并且发值赋给一个引用的情况!
//程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream> #include <string> using namespace std;
float c; float& test(float,float); void main(int argc,char* argv[]) { float &pn=test(3.0f,1.2f); cout<<pn; cin.get(); }
float &test(float a,float b) { c=a*b; return c; }
这种情况同样也不产生临时变量,可读和性能都很好,但有一点容易弄错,就是当c是某个函数的局部变量或者是在堆内存中临时开辟后来又被fee掉了以后的区域,这种情况和返回的指针是局部指针的后果一样严重,会导致引用指向了一个不明确的地址,这种情况在内存中情况见下图!
由于这种情况存在作用域的问题,故我们推荐采用第三种方式处理!
接下来我们说一个利用引用作为左值参与计算的例子,这一点一非常重要,对于理解返回引用的函数是非常有帮助的!
//程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream> #include <string> using namespace std;
float c; float& test(float,float); void main(int argc,char* argv[]) { float &pn=test(3.0f,1.2f); cout<<pn<<endl; test(3.0f,1.2f)=12.1;//把函数作左值进行计算! cout<<pn; cin.get(); }
float &test(float a,float b) { c=a*b; return c; }
通常来说函数是不能作为左值,因为引用可以做为左值,所以返回引用的函数自然也就可以作为左值来计算了.
在上面的代码中
float &pn=test(3.0f,1.2f);
进行到这里的时候pn已经指向到了目标c的地址了.
接下来运行了
test(3.0f,1.2f)=12.1;
把函数作左值进行计算,这里由于test是返回引用的函数,其实返回值返回的地址就是c的地址,自然c的值就被修改成了12.1
|