c++中引用变量的使用
c++中引用是已定义的变量的别名,例如,如果把b作为a变量的引用,则可以交替使用a和b来表示该变量。引用的主要用途是作为函数的形参,通过将引用变量作为参数,函数将使用原始数据,而不是副本(把变量之间传入函数使用的是变量的副本),因此引用为处理大型数据参数的函数提供了一种很好的办法。
- 一、创建引用变量
引用变量用&符号表示(&还可以表示取地址符),例如:把b作为a变量的引用变量:
int a;
int & b = a;
注意:
1.引用变量b和其引用的变量a它们指向相同的值和内存单元,因此改变任意一个值,另一个变量也会跟随一起改变。
2.声明引用的同时必须将其初始化,而不能像指针那样,可以先声明后赋值。(int a; int & b ; b = a;这样是错误的)
3.引用初始化后,就不能被改变。
- 二、将引用作为函数参数
引用常被用作函数参数,使得函数中的变量名成为调用程序中的变量的别名,这种传递参数的方法称为应用传递。在下面的例子中比较了函数参数传递的三种方式:按值传递、指针传递、按引用传递。
#include <iostream>
void swapr(int & a,int & b);
void swapp(int * p, int *q);
void swapv(int a, int b);int main(int argc, const char * argv[]) {using namespace std;int wallet1 = 300;int wallet2 = 500;cout << "wallet1 = $" << wallet1;cout << " wallet2 = $" << wallet2 << endl;cout << "Using references to swap contents:\n";swapr(wallet1,wallet2);cout << "wallet1 = $" << wallet1;cout << " wallet2 = $" << wallet2 << endl;cout << "Using pointers to swap contents again:\n";swapp(&wallet1,&wallet2);cout << "wallet1 = $" << wallet1;cout << " wallet2 = $" << wallet2 << endl;cout << "Trying to use passing by value:\n";swapv(wallet1, wallet2); // pass values of variablescout << "wallet1 = $" << wallet1;cout << " wallet2 = $" << wallet2 << endl;return 0;
}void swapr(int & a,int & b){int temp;temp = a;a= b;b=temp;
}void swapp(int * p,int * q){int temp;temp = *p;*p = *q;*q = temp;
}void swapv(int a,int b){int temp;temp = a;a = b;b =temp;
}
输出结果:
wallet1 = $300 wallet2 = $500
Using references to swap contents:
wallet1 = $500 wallet2 = $300
Using pointers to swap contents again:
wallet1 = $300 wallet2 = $500
Trying to use passing by value:
wallet1 = $300 wallet2 = $500
由结果可知,只有引用和指针成功地交换了变量的值,而按值传递的方法不能,那是因为函数按值传递时,传入的只是变量的一个副本,所以在函数中数值被改变后,不影响原变量的值,而应用和指针传入函数时,会同时改变原变量。为防止引用修改了变量,我们可以用const,double a(const double &b),当代码修改了b时,就会报错。
- 三、将引用用于结构
引用非常适合于结构,使用结构引用参数和变量相同,例如:
struct a
{
int data1;
int data2;
float data3;
};
那么可以编写函数原型:
void set_pc(a & ft);
同样,如果不希望改变传入的结构,可以用const:
void set_pc(const a & ft);
要注意的问题:
1. 避免返回函数终止时不再存在的内存单元引用,比如:
struct free_throws
{int made;int attempts;float percent;
};
const free_throws & clone2(free_throws & ft)
{free_throws newguy;newguy = ft;return newguy;
}
在函数返回一个临时变量(newguy)的引用,在函数运行结束后它将不复存在。
为避免这种问题,可以返回一个座位参数传递给函数的引用:
const free_throws & clone2(free_throws & newguy,free_throws & ft)
{newguy = ft;return newguy;
}
或者采用new来分配新的储存空间:(当不使用时,要用delete释放)
const free_throws & clone2(free_throws & ft)
{free_throws * newguy;*newguy = ft;return *newguy;
}
- 四、何时使用引用参数
使用引用参数的主要原因有两个:
- 程序员能够在函数中修改调用的数据对象
- 通过传递引用而不是整个数据对象,这可以提高程序的运行速度
使用引用、指针、按值传递的原则:
对于使用传递的值不作修改的函数:
- 如果数据对象很小,如内置数据类型或者小型结构,用按值传递
- 如果数据对象是数组,使用指针,这是唯一选择,并将指针声明为指向const指针
- 如果数据对象是较大的结构,则使用const指针或const引用,可以提高效率
- 如果数据对象是类对象,则使用cosnt引用。
对与修改调用函数中数据的函数:
- 如果数据对象是内置数据类型,则使用指针
- 如果数据对象是数组。则只能用指针
- 如果数据对象是结构,则使用指针或者引用
- 如果数据对象是类对象,则使用引用
c++中引用变量的使用相关推荐
- sed在shell脚本中引用变量
需求 在测试过程中,有很多配置项是写在文件中的,这时想通过脚本来改文件内容,这是个很常见的需求 问题 sed 是linux里很强大好用的文本修改工具,但是在使用过程中,需要在shell里的sed语句中 ...
- Python在字符串中引用变量
Python在字符串中引用变量 在字符串中加入变量有三种方法: 1.+ 连字符 name = 'zhangsan' print('my name is '+name) #结果为 my name is ...
- Lambda表达式中引用变量的问题
Lambda表达式中引用变量的问题 Lambda表达式内部自定义的变量肯定没问题.引用的外部final变量也没问题.问题在于effectively final变量的理解,及应用场景的认识.引用的外部变 ...
- C++中引用变量详解
目录 一.什么是引用? 二.引用的注意事项 三.引用的本质 四.常量引用 五.引用的使用场景 六.引用和指针的区别 一.什么是引用? 引用实际上是给一个变量起别名,编译器不会为引用变量开 ...
- Python之在字符串中引用变量的4种方法
在字符串中加入变量有三种方法: 1.+ 连字符 name = 'zhangsan' print('my name is '+name) #结果为 my name is zhangsan 2.% 字符 ...
- shell双引号中引用变量
在shell中传入带双引号的变量 -d '{ "username":"user", "role":["role"] }' ...
- JMeter JSON 转义符中引用变量导致请求发送失败
问题描述类似: https://blog.csdn.net/icecolour/article/details/73176118 在做jmeter发送json报文中存在转义字符的情况下例如:{&quo ...
- 动态改变标题_插入控件-gt;引用变量-gt;实现动态图表纵横筛选
欢迎关注我的微信公众号:HR爱玩儿Excel和PPT,分享有趣又有逼格的Excel和PPT创意和技巧,emmm...不关注也没有关系...哼 昨晚没睡好,因为睡前老友跟我说了句话: 我们总部做的表没有 ...
- php在双引号中输出变量要加大括号,php中输出变量加大括号{}作用_PHP教程
php输出变量加大括号,这是什么写法?看下面一段代码: 代码如下 header("Content-Type:text/html; charset=utf-8"); $test=&q ...
最新文章
- 【WWW2021】高效的非抽样知识图谱嵌入
- mupdf不支持x64_ARM版Win10用户狂喜 微软全新补丁让应用不再不兼容
- APUE读书笔记-第14章-高级I/O
- shell 获取ora报错信息_ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析...
- 获取数组中连续相同的元素
- 简单使用CXF实现webserver(rs的独立发布)
- html文件转换成dwt文件,如何把dwt页面转换成html页面
- 124第十四章—权限的配置
- 距离一个优秀程序员,你还差多少?
- python灰色预测_灰色系统预测GM(1,1)模型
- oracle将把varchar2字段(长度4000)改为clob类型
- 【实用】常用JS验证函数大全
- Unity导入中文文本的解决方法
- [异能程序员]第三章 异能初现(第三更)
- inter uhd graphics630显卡驱动_Intel新驱动已支持Win10 H2更新、11代酷睿狂喜
- 微信企业号__开发记录__二次验证
- 贵阳哪里有计算机二级培训机构,贵阳省计算机二级考试培训
- 前端之HTML基础扫盲
- 红外线感应器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 机器学习技法11: Gradient Boosted Decision Tree(GBDT)