引用--变量的别名

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;
}
 




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值