C引用的作用和用法
C 引用的作用和用法.txt吃吧吃吧不是罪,再胖的人也有权利去增肥!苗条背后其实是憔悴,爱你的人不会在乎你的腰围!尝尝阔别已久美食的滋味,就算撑死也是一种美!减肥最可怕的不是饥饿,而是你明明不饿但总觉得非得吃点什么才踏实。 本文由zpwodeaia贡献 doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 C++ 引用的作用和用法
引用就是某一变量(目标)的一个别名, 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直 完全一样。 作完全一样。 引用名=目标变量名 引用的声明方法: 引用名 目标变量名; 引用的声明方法:类型标识符 &引用名 目标变量名; :int 【例 1】 】 : a; int &ra=a; //定义引用 ra,它是变量 a 的引用,即别名 定义引用 它是变量 的引用, 接 操
在此不是求地址运算, (1)&在此不是求地址运算,而是起标识作用。 ) 在此不是求地址运算 而是起标识作用。 (2)类型标识符是指目标变量的类型。 )类型标识符是指目标变量的类型。 (3)声明引用时,必须同时对其进行初始化。 )声明引用时,必须同时对其进行初始化。 (4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用 )引用声明完毕后,相当于目标变量名有两个名称, 且不能再把该引用名作为其他变量名的别名。 名,且不能再把该引用名作为其他变量名的别名。ra=1; 等价于 a=1; (5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名 )声明一个引用,不是新定义了一个变量, 的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元, 的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也 不给引用分配存储单元。 对引用求地址,就是对目标变量求地址。 不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra 与 &a 相等。 相等。 (6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以 )不能建立数组的引用。因为数组是一个由若干个元素所组成的集合, 无法建立一个数组的别名。 无法建立一个数组的别名。 立引用的引用, ( 7)不能建 立引用的引用 ,不能建立指向引用的指针 。因为引用不是一种 )不能建立引用的引用 不能建立指向引用的指针。 数据类型! 所以没有引用的引用, !所以没有引用的引用 数据类型 ! 所以没有引用的引用 , 没有引用的指针 。 ! 例如: 例如 : int n; ; int &&r=n; //错误 , 编译系统把 错误, 看成一体, ; 错误 编译系统把
引用应用
1、引用作为参数 、 引用的一个重要作用就是作为函数的参数。 引用的一个重要作用就是作为函数的参数。以前的 C 语言中函数参数传递是 值传递,如果有大块数据作为参数传递的时候,采用的方案往往是指针, 值传递,如果有大块数据作为参数传递的时候,采用的方案往往是指针,因为 这样可以避免将整块数据全部压栈,可以提高程序的效率。但是现在( 这样可以避免将整块数据全部压栈,可以提高程序的效率。但是现在(C++中) 中 又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择) ,就是引 又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择) 就是引 , 用。
【例 2】 】 : void swap(int &p1, int &p2) { int p; p=p1; p1=p2; p2=p; } //
此处函数的形参 p1, p2 都是引用 此处函数的形参
为在程序中调用该函数,则相应的主调函数的调用点处, 为在程序中调用该函数,则相应的主调函数的调用点处,直接以变量作为实 参进行调用即可,而不需要实参变量有任何的特殊要求。 参进行调用即可,而不需要实参变量有任何的特殊要求。如:对应上面定义的 swap 函数,相应的主调函数可写为: 函数,相应的主调函数可写为: main( ) { int a,b; cin>>a>>b; //输入 a,b 两变量的值 输入 swap(a,b); //直接以变量 a 和 b 作为实参调用 swap 函数 直接以变量 cout
float &fn2(float r) //定义函数 fn2,它以引用方式返回函数值 定义函数 , { temp=(float)(r*r*3.14); return temp; } void main() //主函数 主函数 { float a=fn1(10.0); //第 1 种情况,系统生成要返回值的副本(即临时变量) 第 种情况,系统生成要返回值的副本(即临时变量) float &b=fn1(10.0); //第 2 种情况,可能会出错(不同 C++系统有不同规定) 系统有不同规定) 第 种情况,可能会出错( 系统有不同规定 //不能从被调函数中返回一个临时变量或局部变量的引用 不能从被调函数中返回一个临时变量或局部变量的引用 float c=fn2(10.0); //第 3 种情况,系统不生成返回值的副本 第 种情况, //可以从被调函数中返回一个全局变量的引用 可以从被调函数中返回一个全局变量的引用 float &d=fn2(10.0); //第 4 种情况,系统不生成返回值的副本 第 种情况, //可以从被调函数中返回一个全局变量的引用 可以从被调函数中返回一个全局变量的引用 cout
(4)引用与一些操作符的重载: )引用与一些操作符的重载: 流操作符
其它方案包括:返回一个流对象和返回一个流对象指针。但是对于 返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说, 返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连 续的两个
是可以连续使用的,例如: 或者(x=10)=100;赋值操作符的返回值必 样,是可以连续使用的,例如:x = j = 10;或者 或者 赋值操作符的返回值必 须是一个左值,以便可以被继续赋值。 须是一个左值,以便可以被继续赋值。因此引用成了这个操作符的惟一返回值 选择。 选择。 【例 6】 测试用返回引用的函数值作为赋值表达式的左值。 】 测试用返回引用的函数值作为赋值表达式的左值。 #i nclude int &put(int n); int vals[10]; int error=-1; void main() { put(0)=10; //以 put(0)函数值作为左值,等价于 vals[0]=10; 函数值作为左值, 以 函数值作为左值 put(9)=20; //以 put(9)函数值作为左值,等价于 vals[9]=10; 函数值作为左值, 以 函数值作为左值 cout=0 && n
引用总结 (1)在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主 )在引用的使用中,单纯给某个变量取个别名是毫无意义的, 要用于在函数参数传递中, 要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问 题。 用引用传递函数的参数, 能保证参数传递中不产生副本, 提高传递的效率, (2) ) 用引用传递函数的参数, 能保证参数传递中不产生副本, 提高传递的效率, 的使用,保证了引用传递的安全性。 且通过 const 的使用,保证了引用传递的安全性。 (3)引用与指针的区别是,指针通过某个指针变量指向一个对象后,对它所指 )引用与指针的区别是,指针通过某
个指针变量指向一个对象后, 向的变量间接操作。程序中使用指针,程序的可读性差; 向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标 变量的别名,对引用的操作就是对目标变量的操作。 变量的别名,对引用的操作就是对目标变量的操作。 的返回值、 (4)使用引用的时机。流操作符 和>>、赋值操作符 的返回值、拷贝构造函 )使用引用的时机。流操作符
1