C++引用的学习
C++引入了引用这个类型,引用实际是给变量起了一个别名,实际上,引用只是别名没有独立的内存空间,和它所引用的变量共享内存空间。
变量的属性有两种:名称和空间。
而引用只有名称没有独立的空间。
对引用的改变就是对它所引用的变量的改变。
格式:int a = 1; int& b = a;
Δ定义引用时一定要初始化,指明该引用变量是谁的别名。
Δ引用一经初始化不能重新指向其他变量。
实际引用中,引用一般用作参数传递与返回值。
#include<iostream>usingnamespacestd;intmain(void){intval=100;//定义引用int&refval=val;//引用必须初始化//int&refval;error引用必须初始化cout<<"val="<<val<<endl;refval=200;//实际上改变的是val变量cout<<"refval="<<refval<<endl;//结果是200intval2=500;refval=val2;//这只是简单的赋值,不代表refval引用至val2这个变量cout<<"val2="<<val2<<endl;//500return0;}
运行结果:
const引用,指向const对象的引用
const int ival = 1024; const int& refval = ival;
Δ普通变量引用const变量是非法的
const int ival = 1024; int& refval = ival ; //error
Δconst变量引用普通变量是合法的。
#include<iostream>usingnamespacestd;intmain(void){constintval=1024;constint&refval=val;//int&ref2=val;error,nonconstreferencetoaconstobjectcout<<"refval="<<val<<endl;intval2=1024;constint&ref3=val2;//允许的//ref3=200;错误的,不能更改const常量cout<<"ref3="<<ref3<<endl;doubleval3=3.4;//warningC4244:“初始化”:从“double”转换到“constint”,可能丢失数据constint&ref4=val3;//等价于产生了一个临时变量,inttemp=val3;constint&ref4=tempcout<<"val3="<<val3<<endl;cout<<"ref4="<<ref4<<endl;//int&ref5=val3;非const不能引用double类型的变量return0;}
运行结果:
引用做函数参数传递:
//按引用传递//swap(int&a,int&b);//C语言里面://值传递形参不能更改实参//指针传递//地址传递方式通过形参的改变使相应的实参改变//引用传递也是可以的//引用作为参数传递#include<iostream>usingnamespacestd;voidswap(int&x,int&y);intmain(void){inta=5;intb=6;cout<<"交换前"<<"a="<<a<<"b="<<b<<endl;swap(a,b);//在函数调用的时候,引用被初始化,x=a,y=bcout<<"交换后"<<"a="<<a<<"b="<<b<<endl;return0;}voidswap(int&x,int&y)//形参是引用,调用的时候被初始化{inttemp=x;x=y;y=temp;}
运行结果:
下面总结下引用于指针的区别:
引用访问一个变量是直接访问,
指针是间接访问
引用只是别名,本身不分配内存空间
指针本身就是一个变量,有自己的内存空间
引用一经初始化就不能再引用其他变量,
指针初始化后引用其他变量,除非const
值传递的时候,实参要初始化形参,就好分配一个形参变量,将实参内容拷贝到形参
如果是类传递的话,还要调用拷贝函数
指针传递 实参初始化形参的时候也是要分配空间的,
引用传递 实参初始化形参时不分配空间,效率会高点
指针传递 本质还是值传递,如果要修改指针的地址,单纯用指针传递也不能的
仅仅修改指针指向的内容,**,指针引用*&
引用作为函数返回值:
//引用作为返回值,将函数放在赋值运算符的左边#include<iostream>usingnamespacestd;inta[]={0,1,2,3,4};int&index(inti){returna[i];//函数返回引用,引用在函数返回的时候初始化//index(3)在函数返回的时候被初始化为a[3]}intmain(void){//引用作为函数返回值,使得函数可以放在运算符的左边index(3)=100;cout<<"a[3]="<<a[3]<<endl;//100return0;}
运行结果:
不能返回对局部变量的引用,或自动化变量的引用:
//不能返回对局部变量的引用,或自动化变量的引用 #include<iostream> usingnamespacestd; int&add(inta,intb) { intsum; sum=a+b; returnsum; } intmain(void) { intn=add(3,4); //n2是引用没有自己独立的空间,依赖于所引用的变量 //如果n2所引用的变量生命期已经结束了, //n2也就是无用的引用,也就是不确定的 int&n2=add(5,6); //cout<<"n2="<<endl; cout<<"n="<<n<<endl; cout<<"n2="<<n2<<endl;//输出不确定的数 return0; }
运行结果:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。