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