C++ “还有什么其他的东西可以做?”;常数;用C++;然后告诉编译器特定的东西是只读的

C++ “还有什么其他的东西可以做?”;常数;用C++;然后告诉编译器特定的东西是只读的,c++,pointers,constants,C++,Pointers,Constants,嗯,我没有意识到,const可能像指针一样令人困惑。请有人分步解释一下下面的代码在const方面到底做了什么 const int*const Method3(const int*const&)const; 即使对于非新手程序员来说,它也是如此令人困惑。这可能令人困惑,因为它将两种常量混为一谈 const int*const Method3(const int*const&)const; 我会重新排列它们,因为在我看来,理解它们的最好方法是反向阅读 让我们从返回类型开始: co

嗯,我没有意识到,
const
可能像指针一样令人困惑。请有人分步解释一下下面的代码在
const
方面到底做了什么

const int*const Method3(const int*const&)const;

即使对于非新手程序员来说,它也是如此令人困惑。

这可能令人困惑,因为它将两种
常量混为一谈

const int*const Method3(const int*const&)const;
我会重新排列它们,因为在我看来,理解它们的最好方法是反向阅读

让我们从返回类型开始:

const int*const -> int const* const
通过向后读取,我们得到:
const
指向
const int
的指针

类似地,对于函数参数:

const int* const& -> int const* const&
通过向后阅读,我们得到:引用
const
指向
const int
的指针

该函数还标记为
const
,这意味着它是一个成员函数,例如,当对该类的引用为常量时,可以调用该函数

有关可能的
const
优化和进一步了解,请参阅以下答案:

    • 将其分解:

      const int*const Method3(const int*const&)const;
        ^         ^             ^          ^      ^  
        |         |             |          |      |
        |         |             |          |      |-> you can use it in objects declared as constants
        |         |             |          | 
        |         |             |          | ->  you get a const pointer to const int(the paramater can no be changed in any form)
        |         |              
        |         | ->  you get a const pointer to const int(the returned value can no be changed in any form)            
      

      const
      告诉编译器某些内容是只读的或引用只读数据(或两者兼而有之)。这是它的主要工作,当您意外地修改了您不打算/不应该修改的内容时,它会帮助编译器(通过编译错误)警告您

      此外,标记成员函数
      const
      (当它们不修改对象时)可以在更多上下文中使用它们


      优化器还可以使用
      const
      来帮助它对代码进行优化,如果它可以证明您确实没有修改
      const
      的话。但由于该语言中存在诸如“别名”、“volatile”、“mutable”和“const_cast”(包括C风格的强制转换)之类的东西,因此在大多数情况下,它这样做的能力相当有限。

      回答您的标题问题,它可能会在某些情况下帮助编译器进行优化。编写“const”的最大好处是当其他人来读你的代码时。至于你的建议,我将把它留给下面的书面回答。
      const int*const
      在我看来是令人敬畏的。如果要有几个常量,那么
      int const*const
      似乎是一个更清晰的语法。在这里查看更多答案:返回常量指针是。。。好。。。无意义的您只需编写
      const int*p=Method3(…)
      即可将其转换为非常量指针。可能与See ALLOW(无耻插头)重复@JesperJuhl Added.@GENIVI-LEARNER指针引用确实是一件事。仔细阅读参考文献,它们大多是指针的语法糖。您可以声明
      int**x
      这是指向
      int
      指针的指针,也可以声明
      int*&x
      这是指向
      int
      指针的引用。适用于
      int*
      的规则与适用于
      int&
      的规则相同,唯一的区别是该值现在是
      int*
      而不是
      int
      。考虑一个别名以使它更清楚:<代码>使用PINT= int */CODE >,这两个例子变成了<代码> PINT*X和<代码> PINT/X。@ GINIVI-学习者参考指针,允许函数修改指针本身。(而不是按值获取指针,将传递的指针重新指定给另一个目标不会修改原始指针)。当然,将它作为对
      常量
      指针的引用会使这一点变得毫无意义,因为
      常量
      指针不能被重定目标。@GENIVI-LEARNER不客气。基本上,从技术上讲,一切都是按值传递的;要按引用传递某物,就要对其进行引用(可以是指针或引用)而是通过值传递,以便可以修改它引用的值(如果不是
      const
      )。这就是引用指针的地方;它允许访问和修改指针本身及其指向的实体。您的ASCII艺术缺少指向第一个和第三个
      const
      @JesperJuhl的行的描述。第一个和第二个
      const
      s使用相同的描述,这与rd和第四条。尽管目前还不清楚,箭头应该从1和3开始,然后穿过2和4,而不是从2和4开始。今天的优化器足够聪明,可以证明变量是否实际修改,无论它是否标记为
      const
      。我最近比较了一些代码的反汇编,包括是否使用const和constd我看到了完全相同的优化:变量被转换成文字而不是从内存中读取。@zett42当然,他们非常聪明,但在某些情况下,const
      可能会进一步帮助他们。参见示例