条款一:仔细区别pointers和references

pointers和reference看起来很不一样(pointers使用“*”和“->”操作符,reference则使用“.”),但它们时候做类似的事情。不论pointers或是references都使得你得间接参考其他对象。那么,何时使用哪一个?你去心中可有一把尺?

1.首先没有null reference。一个reference必须总代表某个对象。

  如果你有一个变量,其目的是用来指向(代表)另一个对象,但是也有可能它不在指向(代表)任何对象,那么你应该使用pointer,因为你可以将pointer设为null。换一个角度看,如果这个变量总代表一个对象,也就是说如果你的设计不允许这个变量为什么null,那么你应该使用reference。

   char *pc=0;//将pointer设为null

  char& rc=*pc;//让reference代表null pointer的解引用值。

 以上代码是有害的,其结果不可预期(C++对此没有定义)编译器可以产生任何可能的输出。

由于reference一定得代表某个对象,C++因此要求reference必须有初值:

string rs;     //错误!references必须被初化。

string s(“xyzzy”);

string& rs=s; //没问题,rs指向s。

但是pointers就没有这样的限制:

string *ps;  //未初始化的指针,有效,但风险高。

“没有所谓的null reference”这个事实意味使用references可能会比使用pointers更富效率。这是因为reference之前不需要测试其有效性:

void printDouble(const double& rd)

{cout<<rd;//不需要测试rd,它一定代表某个double

  }

如果使用的pointers,通常就得测试它是否为null:

void printDouble(const double *pd)

    if(pd){//检查是否为null pointer。

           cout<<*pd;

  }

2.Pointers和references之间的另一个重要差异就是,pointers可以被重新赋值,

指向另一个对象,reference却总是指向(代表)它最初获得的那个对象:

string s1(“Nancy”);

string s2(“Clancy”);

string rs=s1;   //rs代表s1

string *ps=&s1; //ps指向s1

rs=s2;                //rs仍然代表s1,

                              //但是s1的值现在变成了“Clancy"

ps=&s2;       //ps现在指向s2,

                     //s1没有变化。

Note:一般而言,当你不需要考虑“不指向任何对象”的可能性,或是考虑“在不同时间指向不同对象”的能力时,你就应该采用pointer。前一种情况你可以将pointet设为null,后一种情况你可以改变pointer所指对象。而当你确定“总是会代表某个对象”,而且“一旦代表了该对象就不能够再改变”,那么你应该选用reference。

3.还有其他情况也需要使用reference,例如当你实现某些操作符的时候。最常见的例子就是operator[]。这个操作符很特别地必须返回某种“能够被当做assignment赋值对象”的东西:

   vector<int> v(10);//产生一个int vector ,大小为10。

                                     //vector是c++标准程序库

                                     //提供的一个template。

v[5]=10;        //assignment的赋值对象是operator[]的返回值。

如果operator[]返回pointer,上述最后一个语句就写成这样子:

*v[5]=10;

但这使v看起来好像是个以指针形成的vector,事实上它不是。为了这个因素,你应该总是令operator[]返回一个reference。(但有例外 条款30)

conclusion:当你知道你需要指向某个东西,而且绝不会改变指向其他东西,或是当你实现一个操作符而其语法需求无法由pointers达成,你就应该选着reference。任何其他时候,请用pointers。

文章内容来源《More Effective C++》侯捷作为自己学习笔记之用,难免有错漏之处,详细内容请看图书及C++ reference

猜你喜欢

转载自blog.csdn.net/idealhunting/article/details/82746593