【摘录】引用是别名而并非指针

摘自《C++ Common Knowledge》

人们常常会将指针和引用混淆,原因大概在于C++编译器通常采用指针的方式实现引用,但引用其实不是指针,其行为和指针并不相同。

 

引用和指针存在三大区别:

一,不存在空引用;

int &a=*static_cast<int*>(0);   //错误

二,所有引用都要初始化;

三,一个引用永远指向用来对他初始化的那个对象

 

一个指向非常量的引用是不可以用字面常量或临时值进行初始化的:

double &cd=12.3; //错误

然而,一个指向常量的引用就可以:

const double &cd=12.3; //正确

template <typename T>

T add(const T &a,const T &b)

{

return a+b;

}

//…

const std::string &greeting=add(std::string(“hello”),

std::string(“,world”)); //正确

当一个指向常量的引用采用一个字面值来初始化时,该引用实际上被设置为指向采用该字面值初始化的一个临时位置。因此,cd并非真的指向字面值12.3,而是指向一个采用12.3初始化的类型为double的临时变量。

greeting引用则指向对add的调用所返回的无名临时string值。一般来说,这类临时对象在创建它们的表达式的末尾被销毁(离开作用域并且析构函数被调用)。然而,当这类临时对象用于初始化一个指向常量的引用时,在引用指向他们的期间,这些临时对象会一直存在。

posted @ 2010-02-17 17:50  leukotrichia  阅读(279)  评论(0编辑  收藏