关于c ++:函数声明结尾的“const”是什么意思?

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
    }
};

这是什么意思?


"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声明:为什么和如何


考虑两个类类型变量:

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++"也有一个很好的章节。


我总是发现在概念上更容易想到,您正在使这个指针变为常量(这几乎就是它所做的)。