函数返回值:引用类型和非引用类型
来源:互联网 发布:linux cat sed 编辑:程序博客网 时间:2024/04/26 08:48
引用的概念是C++中的,C中不存在引用。
问题1:返回引用类型和非引用类型的区别。
返回非引用类型:函数的返回值用于初始化在调用函数时创建的临时对象。用函数返回值初始化临时对象与用实参初始化形参的方法是一样 的。如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。且其返回值既可以是局部对象,也可以是求解表达式的结果。
返回引用类型:当函数返回引用类型时,没有复制返回值。相反,返回的是对象本身。所以,其效率更高。
问题2:什么时候返回引用是正确的?而什么时候返回const引用是正确的?
返回指向函数调用前就已经存在的对象的引用是正确的。当不希望返回的对象被修改时,返回const引用是正确的。
问题3:什么情况下返回引用才是正确的?*********************请直接忽略问题3,这次回来看后,发现观点欠论据*********************
返回引用,要求在函数的参数中,包含有以引用方式或指针方式存在的,需要被返回的参数。比如:
int& abc(int a, int b, int c, int& result){ result = a + b + c; return result;}或者:
int& abc(int a, int b, int c, int *result){ *result = a + b + c; return *result;}这种形式是错误的:(设计思想错误,can compile and run)
int& abc(int a, int b, int c){ return a + b + c;}
注意4:
- 返回的引用类型是左值。
- 千万不要返回局部对象的引用!千万不要返回指向局部对象的指针!函数执行完毕时,将释放分配给局部对象的存储空间。此时对局部对象的引用就会指向不确定的内存!返回指向局部对象的指针也是一样的,当函数结束时,局部对象被释放,返回的指针就变成了不再存在的对象的悬垂指针。
关于临时对象5:返回非引用类型,存在临时对象这个概念。
- 函数的返回值用于初始化在调用函数时创建的临时对象(temporary object),如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。
- 在求解表达式的时候,如果需要一个地方存储其运算结果,编译器会创建一个没命名的对象,这就是临时对象。C++程序员通常用temporary这个术语来代替temporary object。用函数返回值初始化临时对象与用实参初始化形参的方法是一样的。
- 当函数返回非引用类型时,其返回值既可以是局部对象,也可以是求解表达式的结果。
题外话6:
main函数允许没有返回值就可结束,编译器会自动为其默认返回0。将主函数main返回的值视为状态指示器,返回0表示程序运行成功,其他大部分返回值则表示失败。
代码分析7:(注意看注释)
#include <iostream>using namespace std;int val(){ int i = 1 ; return i ;}int& ref(){ int j = 3 ; int &i = j ; // comment it will also compile. return j ; // 不能返回局部对象的引用,可以将int j = 3 ;放在全局作用域。 // 但是编译器不会报错,只是设计思想有问题,请注意main函数中Attention 1和Attention 2的结果。}int main(){ int vv = val(); //Sconst int& rv = val(); // 编译器报错,error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int' // const int& rv = val(); can compile int vr = ref() ; // Attention 1,编译器不会报错。 int& rr = ref() ; // Attention 2 cout << vv << endl ; //cout << rv << endl ; cout << vr << endl ; cout << rr << endl ; return 0;}运行结果1:
运行结果2:
参考博文:http://blog.csdn.net/keyouan2008/article/details/5741917
http://chinaxxren.iteye.com/blog/1547449
相关博文:关于C++引用的分析
- 函数返回值:引用类型和非引用类型
- c++:函数返回引用类型和非引用类型
- C++函数的返回值——返回引用类型&非引用类型
- C++函数的返回值——返回引用类型&非引用类型
- C++函数的返回值——返回引用类型&非引用类型
- C++函数的返回值——返回引用类型&非引用类型
- C++函数的返回值问题(1)——返回引用类型&非引用类型
- C++函数的返回值——返回引用类型&非引用类型
- C++函数的返回值——返回引用类型&非引用类型
- C++函数的返回值——返回引用类型&非引用类型
- C++函数的返回值——返回引用类型&非引用类型
- C++函数的返回值——返回引用类型&非引用类型
- 函数返回引用类型
- 函数返回引用类型
- C++中函数返回值的引用类型与非引用类型的区别
- C++基础---有返回值类型函数(返回非引用类型)
- 函数返回引用和指针类型
- 函数返回引用和指针类型
- 判断AL是否为十六进制并将其十进制存入AL
- WMI介绍及简单应用
- 基于vxworks的PCI设备驱动编写
- Prototype(原型模型)
- 数据挖掘建模过程
- 函数返回值:引用类型和非引用类型
- 通过配置文件(web.config)实现邮件发送
- [连载]JavaScript讲义(02)--- JavaScript核心编程
- 扬州市宝应县,泰山小学、桃园小学、城中小学等多所学校上千教师罢课
- Android事件机制:事件传递和消费简短总结很不错
- 如何下载Google Play上的APK文件
- puma 配置,启动脚本
- ios中单例的两种写法~~~
- 阳光梦:Android 核心分析 之八------Android 启动过程详解