C++引用(笔记)
来源:互联网 发布:未来软件的发展趋势 编辑:程序博客网 时间:2024/05/18 12:33
引用(reference)是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;
eg.int rat = 100;int & rodent = rat; //rodent是rat的引用
引用的几个特点:
1、引用和原变量具有相同的值,地址也是相同的。可以说,rat相当于一个人的名字,rodent是他的小名。无论怎么称呼,都是指这个人。所以,rat的值变,rodent值变;rodent值变,rat的值也变。
2、这里的&并不是取地址符。
3、在使用引用变量时,必须在声明时初始化。而且一旦初始化便无法再改变值。即是说,引用也可称作指针常量。
eg.int & rodent = rat; //valid//invalidint & bat;bat = rat;int buttly = 50;rodent = buttly; //这里只是赋值给rodent,无法使rodent变为buttly的引用。//通过以下指针的方法也无法改变int *pt = rat;int & mouse = *pt;int bun = 50;pt = &bun;//此时mouse仍是rat的引用
作为函数参数传递的引用:
在 c/c++ 中,访问一个变量只能通过两种方式被访问,传递,或者查询。这两种方式是:
1. 通过值 访问 / 传递变量
2. 通过地址 访问 / 传递变量 – 这种方法就是指针
使用引用传递可使传递的变量在函数中被修改。
当然,如果你只是想让函数使用传递的信息,而不是对信息进行修改,而又使用引用,那么你可以使用常量引用。
eg. double cube(const double &ra);//如果ra在函数中被修改则会生成错误信息。
使用引用传递会对实参要求更加严格,如以下调用会生成错误。
double recube(double &ra);double x = 7.0;recube(x + 3.0);long edge = 5L;recube(edge);recube(7.0);
以上都是会生成错误的,因为函数要求传的是一个double变量,能使其别名为ra的。而上面的会使函数找不到变量。
但是,只需在double &ra前加上const即可调用。因为此时会生成一个临时的匿名变量,使用后可随意删除(临时变量不可修改)。
double recube(const double &ra);
尽可能多的使用const引用参数:
1、可以避免数据修改。
2、使用const能处理const和非const实参,否则只能接受非const数据。
3、能正确生成使用临时变量。
为什么会有引用,引用的最大优点体现在返回结果或者类上。
struct person{ string name; int number};person & getnum(person & target, const person & source){ target.number = source.number++;}person a ={"a",10};person b;b=getnum(b,a);
这段代码有几点要说明的,首先看参数,可以直接修改target来修改传入的值,而我只想要source的信息,所以用const不能修改source的信息。
然后看b=getnum这里。一般的返回结构,是将结构复制至一个临时位置,然后在将拷贝给b。但是如果返回引用,则直接将返回值复制给b,剩下了复制给临时变量的一步,提高了效率。
注意:避免返回函数终止时不再存在的内存引用,如下。
eg. const free_throws & clone(free_throws & ft){ free_throws newguy; newguy = ft; return newguy;}
至于为何使用引用参数:
1、能修改调用函数中的数据对象。
2、通过传递引用而不是整个数据对象,可以提高程序运行速度。(特别当数据对象较大时,如结构和类对象)
什么时候该使用引用:
对于使用传递值而不作修改的函数:
1、如果数据对象很小,如内置数据类型或小型结构,按值传递。
2、如果数据对象是数组,则只能使用指针,并将指针声明为指向const的指针。
3、如果数据对象是较大的结构,则用const引用或const指针,节省复制结构所需的时间及空间。
4、如果数据对象是类对象,则用const引用。
对于修改调用函数中数据的函数:
1、如果数据对象是内置数据类型或数组,则用指针。
2、如果数据对象是结构,则用指针或引用。
3、如果数据对象是类对象,则用引用。
拓展阅读:
http://blog.csdn.net/webscaler/article/details/6577429
- const 引用(c++primer笔记)
- 嗨翻C语言笔记(部分引用)
- 数组引用(C++)
- 引用(C++)
- 引用(C++)
- C++引用(笔记)
- 《c++primer笔记》复合类型--引用
- C++primer学习笔记--右值引用
- C++(常)引用,const,指针引用
- 引用和const引用(笔记)
- 《高质量C/C++编程》学习笔记2(函数、指针、引用)
- (c/c++学习笔记九)引用传递、指针传递和值传递
- 学习笔记:Objective C 的内存管理(1)----引用计数器
- 学习笔记——c++primer学习(二)_头文件引用
- 引用与函数(C++)
- 指针和引用(c++)
- 指针与引用(C++)
- 【C++】引用变量(1)
- Hbase的数据写入
- 第十二章
- 修复mac os中sudo等基础指令不能用
- 第2章 系统本地化和键盘设置
- phantomjs html2Image.js 网页转换图片
- C++引用(笔记)
- Android Toast 默认和自定义使用
- 网页游戏与平台登录对接流程
- python中的实例方法、静态方法、类方法、类变量和实例变量浅析
- struts2中的国际化
- Adapter给listView添加list数据
- latex的beamer幻灯片中对插入的图形Figure编号
- 简单强大的Android内存泄漏检测工具 LeakCanary
- Interesting!