[C++进阶]仔细区别pointers 和reference

2020-04-19  本文已影响0人  小鱼号的代码日记

一个reference必须总代表某个对象,没有所谓的null reference。

永远不要考虑”reference成为null ”的可能性。

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

Pointers可以被重新赋值,指向另一个对象,reference却总是指向(代表)它最初获得的那个对象。

总结:

当你需要指向某个东西,而且绝不会改变指向其他东西,或是当你实现一个操作符(operator[ ])而其语法需要无法由pointers达成,你就应该选择references.任何其他时候,请采用pointers。

/***************************
 more effectivre c++
 35个改善编程与设计的有效方法
 条款1:仔细区别pointer和references
 ---------小鱼号的代码日记--------------
****************************/

#include<iostream>
#include<vector>
using namespace std;

///使用reference之前不要测试其有效性
void printDouble(const double & rd)
{
   cout << rd;  //不需要测试rd,它一定代表么某个double
}
///使用pointers,通常就得测试它是否为null
void printDouble(const double *pd)
{
    if(pd)  //检查是否为null pointer
    {
        cout << *pd;
    }
}
int main()
{
   char *pc = 0;//将pointer 设定为null
   char &rc = *pc;//让reference代表null pointer的解引用
   ///我们将永远不再考虑“reference” 成为null的可能性

   ///string& rs;//错误!reference必须有初值

   ///string s("xyzzy");
   ///string &rs = s; //没问题,rs指向s。

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

   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没有变化

   vector<int> v(10);
   v[5] = 10;         //assignment的赋值对象是operator[]的返回值
   ///如果operator[]的返回pointer,上述最后一个语句就必须写成这样子:
   ///  *v[5] = 10;
   ///你应该总是令operator[]返回一个reference

   ///总结:
   ///当你需要指向某个东西,而且绝不会改变指向其他东西,
   /// 或是当你实现一个操作符(operator[ ])而其语法需要无法由pointers达成,
   /// 你就应该选择references.任何其他时候,请采用pointers。
   return 0;
}

内容选自:
more effectivre c++
35个改善编程与设计的有效方法

上一篇下一篇

猜你喜欢

热点阅读