引用是别名而非指针,引用与指针的区别:
1、不存在空引用
2、所有的引用都要初始化
3、一个引用永远指向用来对它初始化的那个对象
本文地址:http://www.cnblogs.com/archimedes/p/cpp-reference.html,转载请注明源地址。
引用是一个现有对象的别名,用对象来初始化引用后,对象名字或引用的名字都可以用于指向该对象
int a=12; int &ra=a; //ra是a的别名 --ra; //a==11 a=10; //ra==10 int *ip=&ra; //ip指向a
一些编译器可以捕捉到那些明显的创建空引用的尝试:
Employee &anEmployee=*static_cast<Employee*>(0) //error!
有些却无法侦测到不那么明显的空引用:
Employee *getAnEmployee();
//...
Employee &anEmployee=*getAnEmployee(); //可能是糟糕的代码
if(&anEmployee==0) //未定义的行为
如果getAnEmployee返回的是一个空指针,那么其后的代码行为就是未定义的,最好使用一个指针来存放getEmployee返回的结果:
Employee *employee=getAnEmployee(); if(employee)//...
引用常常成为函数参数的优秀选择:
template<typename T> void swap(T &a, T &b) { T temp=a; a=b; b=temp; } //... int x=1,y=2; swap(x,y);
引用所指向的对象可以没有名字:
int grade[MAX]; //... swap(grade[i],grade[j]);
考虑如下函数:
inline void set_2d(float *a, int i, int j, int m) { a[i*m+j]=a[i*m+j]*a[i*m+j]+a[i*m+j]; }
使用引用可以简化和优化:
inline void set_2d(float *a, int i, int j, int m) { float &r=a[i*m+j]; r=r*r+r; }
一个指向非常量的引用是不可以用字面值或临时值进行初始化的:
double &d=12.3 //错误!
swap(string("Hello"),string(", World"));
然而一个指向常量的引用就可以:
const double &cd=12.3; //OK template<typename T> T add(const T &a, const T &b) { return a+b; } //... const string &greeting=add(string("Hello"), string(", World")); //OK