C++小知识

1.引用是别名而非指针

内容:当一个引用初始化时它所指向的那个对象必须存在。即一个引用就是在该引用被初始化之前已经存在的一个对象的别名。一个指向非常量的引用不可以用字面值或临时值进行初始化:

 1template <typename T>
2 void swap(T &a,T &b){
3 T temp(a);
4 a=b;
5 b=temp;
6 }
7 double &d=12.3; //错误!
8 swap(std:string("Hello"), std::string(", world"));// 错误
9
10 //然而指向一个常量的引用就可以
11 const double &cd =12.3;
12 template <typename T>
13 T add(const T &a,const T &b){
14 return a+b;
15 }// OK
16
17 const std::string &greeting= add(std:;string("Hello"),std::string(", world"));//OK

原因:当一个指向常量的引用采用一个字面值来初始化时,该引用实际上被设置为指向采用该字面值初始化的一个临时位置。所以cd并非真的指向字面值12.3,而是指向一个采用12.3初始化的,类型为double的临时变量。greeting引用则是指向对add调用所返回的无名临时string值。一般来说这类临时对象在创建它们的表达式的末尾被销毁(确切的说是,就是离开作用域且析构函数被调用)。但是,当这类临时对象用于初始化一个指向常量的引用时,在引用指向它们的期间,这些临时对象会一直存在。

posted @ 2012-02-19 15:37  FollylloF  阅读(137)  评论(0编辑  收藏  举报