【问题标题】:pointer-to-const can point to non-const object - language design or technical reason?指向常量的指针可以指向非常量对象-语言设计还是技术原因?
【发布时间】:2012-10-25 04:10:23
【问题描述】:
//Example 1 const double pie = 3.14; //const object const double *cptr = &pie; //pointer-to-const to const object double *ptr = &pie; //ERROR - non-pointer-to-const to const object //Example 2 double pie = 3.14; //non-const object const double *cptr = &pie; //non-pointer-to-const to non-const object double *ptr = &pie; //non-pointer-to-const to non-const object

最初我虽然允许指向非常量对象的常量指针,因为它只是意味着 指向 const 的指针不会改变非 const 对象。

但我只是读过 c++ 的书 允许指向非常量对象的常量指针的原因是因为没有 指向 const 的指针真正知道它指向的对象是否为 const 的方法, 所以它将它指向的对象视为 const 但是按照相同的逻辑,非指向 const 的指针会将 const 对象视为非 const 对象 但是编译器会在编译时抛出错误。

我错过了什么吗?

【问题讨论】:

  • const double *cptr 不是 const 指针。
  • 您是正确的,有一个指向非常量对象的“指向常量的指针”仅仅意味着该指针不能用于修改非常量对象。至于你问题的第二部分,我怀疑你误读了这本书(你听起来很困惑,很难理解你的意思:/)。
  • @Jesse Good 编辑了指向 const 指针的 const 指针
  • @Mankarse 我认为这本书让我感到困惑,而不是相反,哈哈
  • @kypronite:呵呵,你说得对(:

标签: c++ pointers constants


【解决方案1】:

声明一个 const 表示,“这个变量的值不应该改变。”

声明一个指向 const 的指针表示“我无意更改我指向的变量”。


问题1:为什么当一个指向变量的指针被赋值为一个const的地址时会报错?

// Example 1
const int i = 0;
int * p = &i;        /* Error */

答案: 因为第一行说,“请保证i 的值不会改变”,但在第二行中编译器不能再做出这样的保证 - 类型指针p 的信息不够严格,无法告诉编译器不允许更改指向的值i


问题 2:为什么将指向 const 的指针分配给变量的地址时不会出错?

// Example 2
int j = 0;
const int * q = &j;  /* No error */

答案:因为指向 const 的指针说,“请保证j 的值不会通过q 改变”。请注意,via q 很重要,因为指向 const 声明的指针并不意味着指向的值必须是常量,只是 使用该指针的人不能使用更改值的指针

【讨论】:

    【解决方案2】:

    指向常量的指针

    const double *p
    

    将它指向的对象视为常量对象,即它不允许您更改它。只要你取消引用指针

    *p
    

    你正在处理一个常量对象。如果您尝试修改它,

    *p = 1.0;
    

    您将收到来自编译器的错误消息。

    另一方面,指向非 const 的指针

    double *p
    

    将它指向的对象视为非常量,因此允许您修改其值:

    *p = 1.0;
    

    变得合法。但是,如果在任何给定时间你有一个常量对象

    const double d = 1.0;
    

    您将无法创建指向它的非 const 指针:

    double *p = &d;
    

    编译器不会接受。所以是的,编译器启用指向非常量的指针来修改它指向的对象。但它不能创建一个指向常量对象的非常量指针。因此,您不会遇到可以使用指向非 const 的指针来修改常量对象的情况。

    关于标题中的问题:这主要是语言设计决定。然而,编译器可以依赖某些对象从不改变值的事实意味着可以进行各种优化。例如,如果同一个指针在函数中被解引用两次,而其他代码在两次解引用之间,并且如果该指针是指向 const 的指针,编译器将假定它实际上不必从内存中获取值两次,因为不允许在第一次和第二次取消引用之间更改值。

    【讨论】:

    • 谢谢,虽然我也是,但我正在阅读的 c++ 书让我感到困惑。
    猜你喜欢
    • 2016-07-18
    • 2021-06-19
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2021-04-19
    • 2014-02-23
    • 1970-01-01
    • 2017-03-07
    相关资源
    最近更新 更多