C++总复习_引用

1.引用的定义
C++语言允许为变量定义引用,定义引用相当于给这个变量起了一个别名。引用和指针一样,都可以用来间接访问被引用(或指向)的变量。
2.引用与指针的区别
引用和指针都被用来间接访问变量。但是,指针是独立于被指向变量的一个变量,指针有自己的内存空间。然而,引用仅仅是被引用变量的别名,引用没有自己的内存空间(起码在程序员的角度是这样的)是否占用内存空间就是指针和引用的本质区别,因为有了这样的区别,在定义和使用它们时有如下几点不同。
1. 作为变量的别名,引用必须初始化,也就是说,引用必须是某个变量的引用。而指针不用。
例如:
int &b;//错误,引用必须初始化
int *p;//正确,指针不必初始化
2. 有空指针,而没有空引用。
例如:
int &b=0;//错误,没有空引用
int *p=0;//正确,空指针代表指针暂时没有指向任何变量
3. 引用在初始化后,不会变更引用的对象,而指针可以变更所指向的对象
例如:
int a1,a2;
int &b=a1;//b是a1的引用
int *p=&a1;//p是a1的指针
p=&a2;//p成为a2的指针,不再指向a1
b=a2;//语法正确,是将a2的值存入b,等价于存入a1,但不是改变b为a2的引用
在同一作用域内为变量定义引用,似乎没有任何用处。引用的主要作用是,在函数传递参数和返回时,传递和返回变量的“正本”。
2.引用参数
C语言中,函数参数是按值传递的,函数调用时会在函数的栈区生成函数实参的副本。在函数中修改参数值,不会对实参产生任何影响,这是对实参的一种保护措施。如果需要在函数中修改某个属于函数作用域之外的变量时,C语言的做法是传递待修改变量的指针。
C++语言中,允许函数参数通过传递引用的方式,来传递实参的“正本”。
这样在函数中访问实参的引用就相当于访问实参变量本身。

f(int);//按值传递

f(const int &);//按常引用传递

这两种传递方式都可以保护传递的实参在函数中不被修改。向函数中传递很大的自定义类型对象时,在不要求修改实参的情况下,为了不在函数栈区产生大对象的副本,一般不采用按值传递,而要传递实参的常引用

2.返回引用
函数返回一个引用时,需要返回一个变量的“正本”,这样的函数即可以作右值又可以可以作左值。
与之相比,当函数返回一个值时,函数只能作为右值。

 6  int bad_at(int *,int);

 7  int& good_at(int *,int);

 8  int main()

 9  {

10         int array[4]={1,2,3,4};

11             cout<<"bad_at(array,0)"<<bad_at(array,0)<<endl;

12         cout<<"good_at(array,1)"<<good_at(array,1)<<endl;

13     

14         //bad_at(array,2)=30;错误,返回一个值时,函数不能作左值

15         good_at(array,3)=40;//正确,返回一个引用时,函数可以作左值

16         cout<<"good_at(array,3)"<<good_at(array,3)<<endl;

17         return 0;

18  }

3.返回引用常见错误

以下的几种情况违反了上述的原则,有的是编译错误,有的则是更可怕的“返回栈内存”错误,返回栈内存会造成难以发现的逻辑错误。

1. 返回按值传递的形参的引用。函数按值传递参数时,形参是建立在函数栈区的临时变量,函数调用结束时,形参占用的空间将被释放。

例如:

int &f(int a)

{

    ……

return a;

}

2. 返回函数中声明的局部变量的引用。函数中的局部变量存储在函数栈区,函数调用结束时,局部变量占用的空间将被释放。

例如:

int &f()

{

    int a;

    ……

return a;

}

3. 返回的表达式不能代表一个变量,仅仅代表一个值。return语句中的表达式仅仅代表一个值时,将会把这个值保存在临时变量中,临时变量不能作为左值出现,所以把这样的表达式作为引用返回时,将出现编译错误。

例如:

int &f(int& a)

{

    ……

return a+1;//编译错误

}

  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值