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

aPo*_*PoC 498 c++ const

可能重复:
C++方法声明中"const"的含义是什么?

我有一本书,里面写着:

class Foo 
{
public:
    int Bar(int random_arg) const
    {
        // code
    }
};
Run Code Online (Sandbox Code Playgroud)

这是什么意思?

Jan*_*net 832

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).现在,在end(int Foo::Bar(int random_arg) const)处添加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正确性

C++'const'宣言:为什么和如何

  • @ereOn,如果你喜欢可变,你可能会喜欢这个."mutable"最常见的用例是作为控制对类实例的访问的互斥锁的修饰符.仅仅因为你保证不修改实例,并不意味着你从中读取的内容不会被持有非const引用的其他人修改. (5认同)
  • @Janick,我一直在学习c ++一两年,从来没有看到任何书籍覆盖这样的解释,我觉得它真的很有帮助.我应该读什么类型的书来学习这些隐含的指针. (3认同)
  • @Steven:我认为最有用的可能是实际阅读C书以及如何在平坦的C中实现一些OO之类的东西.从中可以更容易地看到C++本机OO功能如何映射到更低级别的构造在C和最终到机器. (3认同)
  • 需要注意的 2 个更重要的点:1) 静态数据成员仍然可以修改。2)这里检查Bitwise constness,这意味着调用该函数的对象的内存是逐位检查的,不应对其进行任何更改。这进一步告诉我们,如果有一个 int* 数据​​成员,那么这个指针包含在对象内存中的地址不能改变,但不属于对象内存的那个位置的值可以改变。 (2认同)
  • @LukasThiersch,如果 const 函数调用非 const 函数来更改值,编译器会抛出 **错误**。 (2认同)

Nik*_*sov 44

考虑两个类类型变量:

class Boo { ... };

Boo b0;       // mutable object
const Boo b1; // non-mutable object
Run Code Online (Sandbox Code Playgroud)

现在,您可以调用on的任何成员函数,但只能调用成员函数.Boob0constb1


mkl*_*uwe 12

Bar保证不会更改它被调用的对象.例如,请参阅C++ FAQ中有关const正确性部分.

  • 不要忘记`mutable`关键字. (10认同)

JLW*_*low 9

问题类似.

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


Goz*_*Goz 8

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

  • 实际上,不是`this`指针本身就是`const`,而是指向它,即`*this`;) (7认同)

orb*_*ish 8

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

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

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

我相信Meyers的"更有效的C++"也有一个很好的篇章.