引用--变量的别名

来源:互联网 发布:淘宝关键词搜索在哪 编辑:程序博客网 时间:2024/04/28 02:36
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;