搜索

首页  >  问答  >  正文

C++ Primer中阅读对const的引用一部分的疑惑

书中55页(第五版)写到

既然让ri引用dval,就肯定想通过ri改变dval的值,否则干什么要给ri赋值呢?如此看来,既然大家基本上不会想着把引用绑定到临时量上,C++语言也就把这种行为归为非法。

既然对某个变量的引用是为了通过该引用改变这个变量,那常量引用的意义何在?另外最后一句话“既然大家基本上不会想着把引用绑定到临时量上,C++语言也就把这种行为归为非法。”不是很明白,能不能举一个例子?

PHP中文网PHP中文网2805 天前546

全部回复(4)我来回复

  • 黄舟

    黄舟2017-04-17 13:10:54

    你要结合46页来看,46页说:

    除了2.4.1节(第55页)和15.2.3节(第534页)将要介绍的两种例外情况,其他所有引用的类型都要和与之绑定的对象严格匹配。

    55页介绍的例外就是说 const 引用算一个例外,书中也举了例子,46页中:

    double dval = 3.14;
    int &refVal5 = dval;  //错误:此处引用类型的初始值必须是int型对象

    在55页中:

    double dval = 3.14;
    const int &ri = dval;

    是可以的。

    既然让ri引用dval,就肯定想通过ri改变dval的值,否则干什么要给ri赋值呢?如此看来,既然大家基本上不会想着把引用绑定到临时量上,C++语言也就把这种行为归为非法

    这段话的意思就是为了说明为什么 非const的引用是非法的(46页例子),并不是为了说明const的常量引用的作用。这段话的开头有句是:

    接下来讨论当 ri 不是常量时.......

    常量引用的作用,主要就是为了防止修改所引用的对象。比如你有一个 迭代器,你只希望迭代并不希望该迭代器能够改变引用的元素对象,这时候就要用到常量引用了。

    回复
    0
  • 怪我咯

    怪我咯2017-04-17 13:10:54

    常量引用的意义在于获取值,防止值改变。
    const int &i=1;
    等价于
    int j = 1;
    const int &i=j;

    对临时变量进行非const引用,赋值改变后无法访问被引用变量,无意义。

    而const引用的一大用处在于函数传参:
    void foo(const string& s);
    可以这样调用
    s = “abc”;
    foo(s);
    或者这样调用
    foo(“abc”);
    而非const引用 void foo(string &)对于后一种调用是非法的。

    回复
    0
  • 迷茫

    迷茫2017-04-17 13:10:54

    临时变量只是临时存在,生命期由编译器控制,一般都是完整表达式执行完后释放。
    于是对于一个这样临时的东西,自然修改它没啥意义,因为过会它就死了

    回复
    0
  • 阿神

    阿神2017-04-17 13:10:54

    Hi,
    引用的一部分是替代指针的传递, 来达到修改外部变量的值, 而你说的常量引用是为了数据拷贝而作的优化,试想一下,定义了一个超长的string, 为了避免拷贝复制,就用引用, 用const 是因为避免函数内部修改

    回复
    0
  • 取消回复