What is meant with “const” at end of function declaration?
Possible Duplicate:
Meaning of “const” last in a C++ method declaration?
我有一本书,上面写着:
1 2 3 4 5 6 7 8
| class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
}; |
这是什么意思?
- stackoverflow.com/questions/751681/…副本
- 它将this的类型从Foo* const改为const Foo* const。这是有后果的。
- 我不理解你的编辑。你到底想知道什么?如果声明两个foo类型的变量将创建多个bar函数实例?
- @是的,这正是我想知道的。
- 那么答案是否定的。你为什么认为会是呢?
- 有个朋友告诉我…但是如果没有警察标签,会吗?
- @apoc函数(或这里的方法)只在"内存"中存在一次(无论是static还是不存在,都无关紧要)。他们得到一个隐藏的参数this,它是指向调用实例的指针。
"const函数"(在函数声明后用关键字const表示)使此类函数更改类的成员变量成为编译器错误。但是,在函数内部读取类变量是可以的,但是在函数内部写入将生成编译器错误。
另一种思考这种"const函数"的方法是将类函数视为使用隐式this指针的正常函数。因此,方法int Foo::Bar(int random_arg)(末尾不带const)会产生类似于int Foo_Bar(Foo* this, int random_arg)的函数,而类似于Foo f; f.Bar(4)的调用在内部将与类似于Foo f; Foo_Bar(&f, 4)的函数对应。现在在末尾添加const(int Foo::Bar(int random_arg) const)就可以理解为一个带有const的声明,这个指针是:int Foo_Bar(const Foo* this, int random_arg)。因为在这种情况下,this的类型是const,所以不可能修改成员变量。
可以放宽"const函数"的限制,即不允许函数写入类的任何变量。为了允许某些变量可写,即使函数被标记为"const函数",这些类变量也用关键字mutable标记。因此,如果一个类变量被标记为可变的,并且一个"const函数"写入这个变量,那么代码将干净地编译,并且变量可以更改。(C++ 11)
通常,当处理EDCOX1的0个关键字时,改变C++语句中的const关键字的位置具有完全不同的含义。上述const的用法仅适用于在括号后的函数声明末尾添加const时。
EDCOX1(0)是C++中一个被过度使用的限定符:语法和排序往往与指针组合不直接。一些关于const正确性和const关键字的阅读:
常量正确性
C++的const声明:为什么和如何
- @埃伦,如果你喜欢易变的,你可能会喜欢这个。"mutable"最常见的用例是作为一个互斥体的修饰符来控制对类实例的访问。仅仅因为您承诺不修改实例,并不意味着您从中读取的内容不会被持有非常量引用的其他人修改。
- @ Janick,我已经学习C++一年或两年,从来没有看到任何书籍涵盖这样的解释,我觉得这真的很有帮助。我应该读什么类型的书来学习这些东西,像这个暗示这个指针。
- 史提芬:我认为最有用的事情可能是实际阅读一本C书,以及一些类似于OO的东西是如何在C中实现的。
- 一个很好的答案。但是我发现第二段有点难读,不知道如何改进文本。另外,如果我正确理解了非成员函数Foo_Bar(&f, 4);将无法访问f中的成员变量(无论是常量还是非常量),因为通常成员变量是private。
- 需要注意的2个更重要的点:1)静态数据成员仍然可以修改。2)这里检查位的恒定性,这意味着调用函数的对象的内存是逐位检查的,不应该在其中进行任何更改。这进一步告诉我们,如果有一个int*数据成员,那么这个指针在对象内存中包含的地址是不能更改的,但是该位置上不属于对象内存的值是可以更改的。
考虑两个类类型变量:
1 2 3 4
| class Boo { ... };
Boo b0; // mutable object
const Boo b1; // non-mutable object |
现在您可以调用b0上的Boo的任何成员函数,但只有const限定的成员函数在b1上。
保证Bar不会更改正在调用它的对象。例如,参见C++ FAQ中关于const正确性的部分。
类似于这个问题。
实质上,这意味着方法Bar不会修改Foo的不可变成员变量。
函数无法通过您提供的指针/引用更改其参数。
每当我需要思考这个问题时,我都会转到这个页面:
http://www. PARASIFIF.COM/C++
我相信迈尔斯的"更有效的C++"也有一个很好的章节。
我总是发现在概念上更容易想到,您正在使这个指针变为常量(这几乎就是它所做的)。
- 实际上,不是this指针本身就是const指针,而是它指向的东西,即*this)