引用--变量的别名

本文详细解读了C++中引用的概念、使用规则及注意事项,并通过实例展示了引用在参数传递、返回值、函数调用作为左值以及作为变量别名的应用场景。深入探讨了引用在不同场景下的行为特性,旨在帮助开发者更熟练地掌握和运用C++中的引用机制。
1.引用只可以一个变量所赋值,赋值之后不可以再作为另一个变量的引用。
举例:
int a=0;
int b=1;
int &r=a;
r=b;   // error

什么可以被引用:真值,指针变量。
for instance: 
1. int& r=1;
   相当于:
    double temp=(double)1;  //其实应该也可以是int类型
    int& r=temp;
2. int* iptr;
    int* & r=iptr;  // 表示指针iptr的一个别名为r
    int b=8;
    r=&b;     //ok,经过第二部,r已经成为一个指针,那么这里可以被初始化  
     
什么不可以被引用:数组,NULL。
1. int a[10];
    int& r[]=a;    // error
2. NULL
   引用本身就不是一个实体,不占空间,那么它就不可以是NULL


2.引用传递参数注意问题:多个函数怎么匹配

void fn(int a){};
void fn(int& a){};

void main(){
   fn(5);   // error 这两个函数怎么匹配呢?
}


3.利用引用“返回”多个值?
实际上:利用引用不是说可以返回多个值,而是把需要改变的值以引用的方式传递过去,在函数内部改变它们之后就相当于返回了多个值。
/*
程序目的是得到一个输入值的平方和立方。
*/

#include<iostream>
using namespace std;

void square_cube(int n,int& square,int& cube);

void main(){
  int square;
  int cube;
  int n;

  cin>> n;
  square_cube();
  cout<<square<<" "<<cube<< endl;
}
void square_cube(int n, int& square, int& cube){
   square=n*n;
   cube=n*n*n;
}


















// 传递square,cube的引用过来,那么在函数square_cube内部改变他们的值得时候,
实际上是改变了main中的square,cube的值,所以在main中输出来的的确是n的平方和立方。
  

4.用引用返回值四种类型。

#include <iostream>
float temp;        //全局变量,驻留在内存的data区

float fn1(float r){
   temp = r*r*3.14;
   return temp
}

float& fn2(float r){
   temp=  r*r*3.14;
   return temp;
}
int main(){
   float a=fn1(5.0);    //1
   float& b=fn1(5.0);  //2
   float c=fn2(5.0);    //3
   float& d=fn2(5.0); //4

}

1.   float a=fn1(5.0); 
 
fn1()返回的时候(返回类型为float),data区域的temp的副本赋值给 stack区的临时变量,a=fn1()之后临时变量再赋值给a。

2.   float& b=fn1(5.0);

fn1()返回的时候(返回类型为float),data区域的temp的副本赋值给stack区的临时变量,b=fn1()之后,b作为临时变量的一个别名;
危险!因为临时变量会随着fn1()的结束而消失,那么引用b也会变得没有意义,所以着这种做法不合适。

3.   float c=fn2(5.0);  

fn2返回的时候(返回类型为float&),data区域的temp的副本直接越过临时变量,在c=fn2()之后,直接复制给c。

4.   float& d=fn2(5.0); 

fn2返回的时候(返回类型为float&),在d=fn2()之后d直接作为temp的一个别名(而不是向前面那么作为临时变量的别名)。

5.利用引用让函数调用作为左值

#include <iostream>
using namespace std;

int n;
int& num(int& n);
void main(){
   n=1;
   num(n)++;  //函数调用作为左值。
}
int& num(int& n){
   return n;
}
 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值