区分指针和引用

区分指针和引用

摘自:《More Effective C++》

      指针和引用看上去非常不同(指针使用“*”和“->"操作符,引用使用的是”.“),但是它们所做的事情似乎很类似。指针和引用都可以间接地指代其他对象。那么,如何决定什么时候使用其中一个而不是另外一个?

      首先,要认识到不存在类似于空引用(null reference)这样的东西。 引用必须指代某个对象。因此,如果有一个用于指代另一个对象的变量,但是有可能没有这么一个可供指代的对象,这时就应该把这个变量声明成指针,因为这样就可以把它设为空值(null)。反之,如果这个变量必须指代一个对象,也就是说,不允许这个变量为空值,那么你基本上应该把这个变量声明成引用。

      不存在空引用这个事实意味着,使用引用比使用指针更搞笑。因为在使用引用之前不需要测试是否有效。
different
void printDouble(const double& rd)
{
    cout 
<< rd;            // no need to test rd; it
                        
// must refer to a double
}


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

}

      另一个重要不同之处:指针可以被重新赋值用以指向另外一个不同的对象;而引用则总是指向初始化时它所指代的对象。
Another Difference
string s1("Nancy");
string s2("Clancy");

string& rs = s1;    // rs refers to s1
string *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;
            
//

      总而言之,当需要考虑以下两种情况的时候,你应该使用指针:
            A.有可能什么也不指向(这种情况下,你可以把指针设为null);
            B.需要能够在不同时候指向不同的对象。
           
      当你知道总是会指向某一个对象并且还知道一旦指向那个对象,就不会再指向其他对象的时候,应该使用引用。
      还有一种情况应该使用引用,即当实现某些操作符的时候。最常见的例子是[ ]操作符。这个操作符通常需要返回一个值作为(下一个)赋值语句的赋值目标。
Difference
vector<int> v(10);    // create an int vector of size 10;
                    
// vector is a template 
                    
// standard C++ library (see Item 35)
                    
v[
5= 10;            // the target of this assignment is
                    
// the return value of operator[]
                    
// 如果[ ]操作符返回一个指针,上面最后一个语句就必须写成:
×v[5= 10;

// 但是这让v看起来像是一个关于指针的向量(vector),而实际上并非如此。
//

      当你知道要指代某个对象并且不会再指代其他的东西时,那就应该选择引用。当实现某些操作符的时候,如果这些操作符在语义上的要求使得指针不可行,此时仍然需要使用引用。其他情况下,应该使用指针。

你可能感兴趣的:(区分指针和引用)