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

时间:2010-06-29 13:31:03

标签: c++ const

  

可能重复:
  Meaning of “const” last in a C++ method declaration?

我有一本书,里面写着:

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

这是什么意思?

6 个答案:

答案 0 :(得分:785)

在函数声明之后用关键字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关键字一样,在C ++语句中更改const关键字的位置具有完全不同的含义。 const的上述用法仅适用于在括号后的函数声明末尾添加const时。

const是C ++中一个高度过度使用的限定符:与指针结合使用时,语法和顺序通常并不简单。有关const正确性和const关键字的一些读数:

Const correctness

The C++ 'const' Declaration: Why & How

答案 1 :(得分:39)

考虑两个类型变量:

class Boo { ... };

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

现在,您可以在Boob0调用 const的所有成员函数,但b1上只有{{1}}个符合条件的成员函数。

答案 2 :(得分:12)

保证

Bar不会更改正在调用的对象。例如,请参阅C ++常见问题解答中的section about const correctness

答案 3 :(得分:8)

this问题类似。

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

答案 4 :(得分:8)

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

每次我需要考虑它时都会转到此页面:

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

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

答案 5 :(得分:7)

我总是觉得在概念上更容易想到你正在制作这个指针const(这几乎就是它的作用)。