【More Effective C++ 条款1】仔细区别pointers和references

1)操作符的差别

  指针使用“*”和“->”操作符,而引用使用“.”操作符

2)初始化的差别

  有空指针,但是没有空引用,和const对象一样,引用一旦定义就必须和对象绑定(当然char* pc=0;char& rc=*pc;也合法但无意义)

由此造成的影响:

  2.1)对于指针的向下转型,如果失败则返回空指针,但由于没有空引用的说法,所以对于引用的向下转型如果失败则会抛异常

  2.2)由于引用不能为空,所以对于引用的使用不需要测试其有效性,而对于指针的使用往往要测试其是否为空

3)赋值的差别

  对于指针可以重新赋值,而对于引用,一旦初始化就不能再与其他对象绑定

4)语法的差别

  指针存的是地址,使用时需要解引用,而引用则是别名

5)总结

  “当你需要考虑“不指向任何对象”的可能性时,或是考虑“在不同的时间指向不同的对象”的能力时,你应该采用指针,当你确定“总是会代表某个对象”,而且“一旦代表了改对象就不能够再改变”,那么你应该选用引用”

  “当你知道需要指向某个东西,而绝对不会改变指向其他东西,或是当你实现一个操作符而其语法需求无法由指针完成,你就应该选用引用,任何其他时候,请采用指针”

6)补充

  尽管引用一直被称作是别名,但其实引用也是占空间的,这个可以通过将一个引用封装在一个类中看出(占4个字节),而直接对引用取地址和取大小得到的是被引用对象的地址和大小

int x=10;
class A
{
    int &r=x;
};

int main()
{
    cout<<sizeof(A)<<endl;//4
    A a;
    cout<<sizeof(a)<<endl;//4
}
posted @ 2019-10-17 10:42  西*风  阅读(172)  评论(0编辑  收藏  举报