Item 1: distinguish between pointers and references

《Footprint on 'More Effective c++'》

作为一名不怎么合格的C++程序猿,还没好好看过这本书,伐开心。

万里长征第一步就从今天开始吧~


Item1: distinguish between pointers and references

一直觉得pointers和references没什么区别,除了写放上的'.'和'->'以外,其实用的时候需要上点心~


1  NULL & IN-NULL

pointers:指针可以为NULL,也可以delete空指针,但是用的时候需要先确认指针是否非空,否则野指针会crash你的程序;

reference:引用必须IN-NULL,它存在的意义就是“代表”某个object。

WARNING:
char *pc = 0;          // set pointer to null
char& rc = *pc;        // make reference refer to
                       // dereferenced null pointer

void printDouble(const double& rd){    
  cout << rd;         // no need to test rd; it
}

void printDouble(const double *pd)
{
  if (pd) {             // check for null pointer
    cout << *pd;
  }
}


2 Initialization

pointers:定义时可以不初始化,但不推荐这样的风格;

reference:定义时必须初始化,且引用整个生命周期内只指向一个object。

EXAMPLE:
string& rs;             // error! References must
                        // be initialized
string s("xyzzy");
string& rs = s;         // okay, rs refers to s
string *ps;             // uninitialized pointer:
                        // valid but risky
EXAMPLE:
string s1("Nancy");
string s2("Clancy");
tring& rs = s1; // rs refers to s1
tring *ps = &s1; // ps points to s1
rs = s2; // rs still refers to s1,
// but s1's value is now
// "Clancy"
ps = &s2; // ps now points to s2;
// s1 is unchanged

3 Reference Only

实现某些operators的时候必须用reference,比如operator[ ],考虑到它的返回值可能会被当做left-value。

vector<int> v(10);       // create an int vector of size 10;
                         // vector is a template in the
                         // standard C++ library (see Item 35)

v[5] = 10;               // the target of this assignment is
                         // the return value of operator[]

否则,就会这样写了,显然我们不喜欢:
*v[5] = 10;

In general,

reference相当于“是”的关系,它的存在就是另一个对象的代名词,所以该对象必须存在!

pointers可以为NULL,如果有这种可能性的话,就必须用指针。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值