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

我有一本书,里面写着这样的话:

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

这是什么意思?

640580 次浏览

在函数声明后用关键字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 this指针的声明:int Foo_Bar(const Foo* this, int random_arg)。由于this在这种情况下的类型是const,因此无法修改成员变量。

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

与处理const关键字时一样,更改const关键字在C++语句中的位置具有完全不同的含义。const的上述用法仅适用于将const添加到括号后的函数声明末尾。

const在C++中是一个高度滥用的限定符:语法和顺序通常与指针结合起来并不简单。一些关于const正确性和const关键字的阅读:

常量正确性

C++'const'声明:为什么和如何

类似于这个问题。

本质上,它意味着方法Bar不会修改Foo的非可变成员变量。

Bar保证不会更改正在调用它的对象。例如,请参阅C++常见问题解答中的关于const正确性的部分

我总是发现从概念上更容易想到你正在使this指针常量(这几乎是它所做的)。

考虑两个类类型的变量:

class Boo { ... };


Boo b0;       // mutable object
const Boo b1; // non-mutable object

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

函数无法通过您给它的指针/引用更改其参数。

每次我需要思考的时候都会去这个页面:

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

我相信在迈耶斯的“更有效的C++”中也有一个很好的篇章。