C++返回引用的函数
要以引用返回函数值,则函数定义时的格式如下:
类型标识符&类型名 (形参列表及类型说明)
{ 函数体 }
用const限定引用的声明方式为:
const 类型标识符&引用名=目标变量名;
用这种方式声明的引用不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,保证了 引用的安全性。
注意几点:
- 要以引用返回函数值,则定义函数时需要在函数名前加上&。
- 用引用返回一个函数值的最大好处是:在内存中不产生被返回值的副本;而用普通的返回值的方法返回一个函数的函数值时,需要在内存中先创建一个临时变量,在被调函数返回时,将函数值复制到该临时变量中,主调函数再以该临时变量的值进行运算。
- 在引用的使用中,单纯给某个变量取个别名是毫无意义的, 引用的目的主要是在函数参数传递中解决大对象的传递效率和空间不如意的问题。
- 用引用传递函数的参数能保证参数传递中不产生副本和提高传递的效率,且通过const的使用,又保证了引用传递的安全性。
- 引用与指针的区别在于:指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作,程序中使用指针使程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。
- 一般情况下,赋值表达式的左边只能是变量名,即被赋值的对象必须是变量,因为孩子有变量才能被赋值,而常量或表达式不能被赋值,但如果一个函数的返回值是引用,则赋值号的左边可以是该函数的调用。
本人自学,教材可能有点老,有问题的话求大家指正!!!谢谢!!!
例题:
- 定义一个普通的函数,使用返回值的方法返回函数值,定义另一个函数使用引用的方法返回函数值
#include<iostream>
using namespace std; int f1(int a);
int &f2(int a); int f1(int a)
{
int num;
num = a*;
return num;
} int &f2(int a)
{
int num;
num = a*;
return num;
} int main()
{
int a,b;
a=f1();
b=f2();
cout << f1() << endl;
cout << f2() << endl;
cout << a << endl;
cout << b << endl;
//int &ra=f1(3); 这种用法可能会出错,(不同C++系统有不同规定)
int &rb=f2();
cout << rb << endl;
return ;
}
- 使用返回引用的函数值作为赋值表达式的左值
#include<iostream>
using namespace std; int &put(int n);
int vals[];
int error=-; int &put(int n)
{
if(n>= && n<=)
return vals[n];
else
{
cout << "error!" << endl;
return error;
}
} int main()
{
put()=;
put()=;
cout << vals[] << endl;
cout << vals[] << endl;
return ;
}
- 使用const限定引用
include<iostream>
using namespace std; int &fn(const int &a)
{
//a=32; 错误!不可以进行赋值
int b=a;
return b; //如果返回a,也会报错
} int main()
{
int &a = fn();
cout << a << endl;
return ;
} //菜鸟,求大家批评指教,代码编写习惯和规范等等!!!谢谢!!!
本人自学,教材可能有点老,有问题的话求大家指正!!!谢谢!!!
C++返回引用的函数的更多相关文章
- PHP:第三章——PHP中返回引用的函数
<?php header("Content-Type:text/html;charset=utf-8"); $i=1; function &F(){ global $ ...
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同 but------> 可以返回派生类对象的引用或指针
您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ...
- php函数返回引用示例
<?php class Test { public $userCache; public function init() { for($i = 0; $i < 5; $i++) { $us ...
- 【转】C/C++ 引用作为函数的返回值
转自:https://blog.csdn.net/weixin_40539125/article/details/81410008 这篇文章写的很好: 语法:类型 &函数名(形参列表){ 函数 ...
- 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数
[源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...
- C# 7.0 新特性4: 返回引用
本文参考Roslyn项目中的Issue:#118. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...
- c++中有些重载运算符为什么要返回引用
事实上,我们的重载运算符返回void.返回对象本身.返回对象引用都是可以的,并不是说一定要返回一个引用,只不过在不同的情况下需要不同的返回值. 那么什么情况下要返回对象的引用呢? 原因有两个: 允许进 ...
- c++中返回对象与返回引用的区别
这几天在做用C++做课程设计,对其返回对象的实现感到迷惑. 通过对汇编代码的分析,可以清楚的看到,直接返回引用和返回对象的区别到底是什么. 分析的程序如下 #include<cstdio> ...
- js创建对象的三种方法:文本标识法和构造器函数法和返回对象的函数
文本标识法和定义变量差不多,像这样 var obj = {name:'HanMM','2':'Dali'}; 函数构造器法 先创建一个对象函数 function Obj() { this.addre ...
随机推荐
- INSTALL_FAILED_VERSION_DOWNGRADE报错
error: INSTALL_FAILED_VERSION_DOWNGRADE 原因:模拟器或者实际的device中已经安装了同名的app,且本次的版本并不高 解决:在模拟器中卸载此同名应用,之后再运 ...
- IIS7及以上伪静态报错404
内容摘要:故障现象:DTCMS开启伪静态功能,VS2010预览正常,发布到IIS后报错404.0错误(WIN7,WIN8,SERVER2008).模块IISWebCore通知MapRequestHan ...
- 【转】C/C++求模求余运算符——2013-08-20
http://blog.csdn.net/whealker/article/details/6203629 求模运算符(%),或称求余运算符,也就是数学上所谓的除法中的余数,%两侧均应为整数, |小| ...
- Referenced file contains errors (http://www.springframework.org/schema...错误--转载
Referenced file contains errors (http://www.springframework.org/schema/beans/spring-beans-3.0.xsd). ...
- 对ContentProvider中getType方法的一点理解
在上篇博客中我们介绍了自定义ContentProvider,但是遗漏掉了一个方法,那就是getType,自定义ContentProvider一般用不上getType方法,但我们还是一起来探究下这个方法 ...
- 从Kali 2.0 转至 Kali Rolling
1. 修改官方软件库列表 编辑/etc/apt/sources.list,注释掉原有内容,然后添加下述内容. # kali rolling deb http://http.kali.org/kali ...
- su: cannot set user id: Resource temporarily unavailable
今天R&D所在主机出现su: cannot set user id: Resource temporarily unavailable资源不可用报错,直接通过其他机器ssh huyuh@xxx ...
- JBPM WEB CONSOLE安装实录
http://www.blogjava.net/paulwong/archive/2009/03/13/259551.html JBPM WEB CONSOLE是一个B/S端的,能管理JBPM的流程和 ...
- 从入行到现在(.net)
每次写东西都不知道怎么去开头.因为一想到要写东西.脑子里面浮现出来的开头就太多. 进园子很久从开始只是关注别人讲的技术,别人讲的基础,到现在更多的去看大家的随笔和新闻.这两年我从零基础的外行人逐渐进入 ...
- C# DataTable转List And List转DataTable
// DataTable转List: IList<HousesEntity> Ilist = TableAndList.ConvertTo<HousesEntity>(dt); ...