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++中引用变量的使用相关推荐

  1. sed在shell脚本中引用变量

    需求 在测试过程中,有很多配置项是写在文件中的,这时想通过脚本来改文件内容,这是个很常见的需求 问题 sed 是linux里很强大好用的文本修改工具,但是在使用过程中,需要在shell里的sed语句中 ...

  2. Python在字符串中引用变量

    Python在字符串中引用变量 在字符串中加入变量有三种方法: 1.+ 连字符 name = 'zhangsan' print('my name is '+name) #结果为 my name is ...

  3. Lambda表达式中引用变量的问题

    Lambda表达式中引用变量的问题 Lambda表达式内部自定义的变量肯定没问题.引用的外部final变量也没问题.问题在于effectively final变量的理解,及应用场景的认识.引用的外部变 ...

  4. C++中引用变量详解

    目录 一.什么是引用? 二.引用的注意事项 三.引用的本质 四.常量引用 五.引用的使用场景​​​​​​​ 六.引用和指针的区别 一.什么是引用? 引用实际上是给一个变量起别名,编译器不会为引用变量开 ...

  5. Python之在字符串中引用变量的4种方法

    在字符串中加入变量有三种方法: 1.+ 连字符 name = 'zhangsan' print('my name is '+name) #结果为 my name is zhangsan 2.% 字符 ...

  6. shell双引号中引用变量

    在shell中传入带双引号的变量 -d '{ "username":"user", "role":["role"] }' ...

  7. JMeter JSON 转义符中引用变量导致请求发送失败

    问题描述类似: https://blog.csdn.net/icecolour/article/details/73176118 在做jmeter发送json报文中存在转义字符的情况下例如:{&quo ...

  8. 动态改变标题_插入控件-gt;引用变量-gt;实现动态图表纵横筛选

    欢迎关注我的微信公众号:HR爱玩儿Excel和PPT,分享有趣又有逼格的Excel和PPT创意和技巧,emmm...不关注也没有关系...哼 昨晚没睡好,因为睡前老友跟我说了句话: 我们总部做的表没有 ...

  9. php在双引号中输出变量要加大括号,php中输出变量加大括号{}作用_PHP教程

    php输出变量加大括号,这是什么写法?看下面一段代码: 代码如下 header("Content-Type:text/html; charset=utf-8"); $test=&q ...

最新文章

  1. 【WWW2021】高效的非抽样知识图谱嵌入
  2. mupdf不支持x64_ARM版Win10用户狂喜 微软全新补丁让应用不再不兼容
  3. APUE读书笔记-第14章-高级I/O
  4. shell 获取ora报错信息_ORA-04030: 在尝试分配...字节(...)时进程内存不足的原因分析...
  5. 获取数组中连续相同的元素
  6. 简单使用CXF实现webserver(rs的独立发布)
  7. html文件转换成dwt文件,如何把dwt页面转换成html页面
  8. 124第十四章—权限的配置
  9. 距离一个优秀程序员,你还差多少?
  10. python灰色预测_灰色系统预测GM(1,1)模型
  11. oracle将把varchar2字段(长度4000)改为clob类型
  12. 【实用】常用JS验证函数大全
  13. Unity导入中文文本的解决方法
  14. [异能程序员]第三章 异能初现(第三更)
  15. inter uhd graphics630显卡驱动_Intel新驱动已支持Win10 H2更新、11代酷睿狂喜
  16. 微信企业号__开发记录__二次验证
  17. 贵阳哪里有计算机二级培训机构,贵阳省计算机二级考试培训
  18. 前端之HTML基础扫盲
  19. 红外线感应器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  20. 机器学习技法11: Gradient Boosted Decision Tree(GBDT)

热门文章

  1. 查看Linux的核数和内存等相关系统配置
  2. 搜索优化之四叉树算法(一)
  3. PHP redis配置说明
  4. IDEA断点无效(干货)
  5. python清除变量方法
  6. Chrome浏览器最常用的快捷键
  7. 原生javascript-图片查看器的制作-注释版
  8. tekton EventListener资源
  9. 【安装配置Git】最新版Git安装教程
  10. 从恶意程序对LNK格式的利用方法看防护趋势