函数声明结尾的“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 ++”也是一个很好的篇章。