zoukankan      html  css  js  c++  java
  • Gotchas 6对常量(性)的认识误区

    摘要:

    1)“字面常量没有地址,永远不能改变其值”③
    2)关于左值和右值得理解误区:
    左值并不是指能放在赋值号左边的值,右值自然也不是指能放到赋值号右边的。左值可以放在赋值号右边,但右值一定只能是在赋值号的右边。但左值也不一定能放在赋值号的左边:
    const int i;
    对于常量i是不能放在赋值号的左边的,但其的的确确是个左值,它是一个不能改变的左值。
    正确的理解是:左值是“能放置值得地方”,而右值就是没有与之相关的地址的值。
    3)关于常量性的理解:
    int i=10;
    const int *ip=&i;
    i=10;//没问题,约束的不是i的一般操作,而是通过ip对i的操作
    *ip=13;//错误
    “const这个修饰词描述了通过ip对i的操作约束,而不是对i一般操作的约束”①
    “这里我们就有了一个指向const int类型的指针,而这个const类型对象又是一个普通的int类型对象的引用。这里的常量性仅仅限制了我们能通过ip做什么。这不表明i不会变,只是对它的修改不能通过ip进行。如果我们把问题说的再详细一点,请看下面这个把const和volatile结合使用的例子:
    extern const volatile time_t clock;
    这个const修饰词表面我们未被允许(在代码中显示的直接的)修改ckock的值,但是同时存在volatile修饰词说明clock肯定还是会通过其他途径发生变化”②
    =======================================================
    注释:
    ①译注:也就是说变量本身不具有常量性,具有常量性的是通过指针反引用的那个能够作为左值得表达式(*ip),虽然这两者从观念上来看,是同一个对象。这就让我们理解,C++常量性不是根据低级地址绑定的,而是富有高级的对象观念的。
    ②译注:这个例子说明了C++中的常量性的观念只限制了在代码中对const修饰的变量显示的直接修改,对于其他方式修改,并不是C++语言的常量性的要求。总体来看本文指出了常量性是高级操作。
    =======================================================
    个人理解:
    对于③的理解:
    int &i=12;//错误,“引用必须以左值来初始化”→常见错误44:引用和临时对象
    const int &i2=12;//正确,编译器会声明一个临时对象
    但是不要试图通过下面的方式改变字面常量12的值:
    const_cast<int &>(i2)=11;//赋值给那个匿名临时对象,或者程序直接崩溃。
    =========================================================
    See Also
    常见错误44:引用和临时对象

  • 相关阅读:
    数据库作业
    5-5 数据库笔记整理
    5月4日数据库笔记整理
    数据库
    4.27内容整理
    python基础4
    python基础4
    python基础 3
    完善版二级联动(可作为函数)需要导入jquery
    jquery $this 指向子元素
  • 原文地址:https://www.cnblogs.com/zhanjindong/p/2839859.html
Copyright © 2011-2022 走看看