《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 sstring *ps; // uninitialized pointer: // valid but riskyEXAMPLE: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,如果有这种可能性的话,就必须用指针。