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
可能会进一步帮助他们。参见示例