美文网首页
[C++进阶]仔细区别pointers 和reference

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

作者: 小鱼号的代码日记 | 来源:发表于2020-04-19 18:46 被阅读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个改善编程与设计的有效方法

    相关文章

      网友评论

          本文标题:[C++进阶]仔细区别pointers 和reference

          本文链接:https://www.haomeiwen.com/subject/kzlbbhtx.html