函数声明结尾的“const”是什么意思?

可能重复:
C ++方法声明中最后一个“const”的含义?

嗨,我有一本书,写有这样的东西:

class Foo { public: int Bar(int random_arg) const { // code } }; 

此外,一个顺便问题:为什么我应该/不应该在参数声明之前使用const ? 这个改变是什么?

 int Foo (const int Bar) { /* code */ } 

编辑:所以,如果我现在做:

 Foo v1, v2; 

(const标记的)Bar函数会在内存中存在3次还是1次?

一个“const函数”,在函数声明之后用关键字const表示,使得这个类函数改变该类的成员variables是一个编译器错误。 但是,在函数内部读取一个类variables是可以的,但是在这个函数内写入会产生编译器错误。

考虑这种“const函数”的另一种方法是通过将一个类函数视为一个隐含的指针的普通函数。 所以一个方法int Foo::Bar(int random_arg) (最后没有const)会产生一个像int Foo_Bar(Foo* this, int random_arg)和一个像Foo f; f.Bar(4)这样的Foo f; f.Bar(4) Foo f; f.Bar(4)将在内部对应类似于Foo f; Foo_Bar(&f, 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) 。 由于这种情况下的types是const,因此不可能修改成员variables。

可以放宽不允许函数写入任何类的variables的“const函数”限制。 为了允许某些variables即使在函数被标记为“const函数”时也是可写的,这些类variables被标记为关键字mutable 。 因此,如果一个类variables被标记为可变,并且一个“const函数”写入这个variables,那么代码将会干净地编译并且该variables是可能改变的。 (C ++ 11)

像往常一样,在处理const关键字时,在C ++语句中改变const关键字的位置具有完全不同的含义。 const的上述用法仅适用于在括号后的函数声明的末尾添加const的情况。 const在C ++中是一个高度过度使用的限定符,语法和顺序往往不是直接与指针结合使用。 关于const正确性和const关键字的一些读数:

Const正确性

C ++“const”声明:为什么&How

考虑两个typesvariables:

 class Boo { ... }; Boo b0; // mutable object const Boo b1; // non-mutable object 

现在你可以在b0上调用Boo 任何成员函数,但是只能在b1上调用const限定的成员函数。

Bar保证不改变它被调用的对象。 例如,请参阅C ++ FAQ中有关常量正确性的部分 。

类似于这个问题。

实质上这意味着Bar的方法不会修改Foo非可变成员variables。

我总是觉得从概念上来说容易想到,你正在使这个指针为const(这几乎是它所做的)。

函数不能通过你给它的指针/引用来改变它的参数。

每当我需要考虑时,我都会去这个页面:

http://www.parashift.com/c++-faq-lite/const-correctness.html

我相信Meyers的“更有效的C ++”也是一个很好的篇章。