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 ...
随机推荐
- 局域网动态ip
1. 局域网IP对网速没有任何影响.点“开始”“设置”进入“网络连接” 右击“本地连接”选择“属性”选中“Internet协议(TCP/IP)” 在下面的一些按钮中点“属性”,之后你可以设置局域网IP ...
- HDU-1018(简单数学)
Big Number Problem Description In many applications very large integers numbers are required. Some o ...
- ECMA5 Array 新增API reduce
1)reduce:相当与迭代: [].reduce(function(previous,current,index,array){ return previous * current;//相当与做阶乘 ...
- Nullable类型和HashSet<T>集合
今天接触到两个新的类型,查了一下才发现它们已经出现好久了,特作一下标记 Nullable结构 在System命名空间下,在 .NET Framework 2.0 版中是新增的:用它定义的值类型的对象与 ...
- C#数组按值和按引用传递数组区别
C#中,存储数组之类对象的变量并不是实际存储对象本身,而是存储对象的引用.按值传递数组时,程序将变量传递给方法时,被调用方法接受变量的一个副本,因此在被调用时试图修改数据变量的值时,并不会影响变量的原 ...
- CSS控制长文本内容显示(截取的地方用省略号代替)
自动换行问题,正常字符的换行是比较合理的,而连续的数字和英文字符常常将容器撑大,下面介绍的是CSS如何实现处理的方法. 现实中经常出现一些内容比较长的文本,为了使整体布局美观,需要将文本内容控制在一行 ...
- mybatis 打印 sql
该文中使用的log框架为logback myBatis3.0.6左右的版本时 打印sql的时候只需要配置如下属性: <logger name="java.sql.Connection& ...
- 500 OOPS: cannot change directory:/home/test
问题: 以root 从远程客户端 登录 FTP 一直密码错误. 发现不能以root 登录, 需要创建其它的用户. 创建一个test 用户后(如下): useradd test; passwd ...
- js 实现图片旋转角度
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【POJ2094】【差分序列】Angry Teacher
Description Mr. O'Cruel is teaching Math to ninth grade students. Students of course are very lazy, ...