可能重复:
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关键字的读数:
Nik*_*sov 44
考虑两个类类型变量:
class Boo { ... };
Boo b0; // mutable object
const Boo b1; // non-mutable object
Run Code Online (Sandbox Code Playgroud)
现在,您可以调用on的任何成员函数,但只能调用成员函数.Boob0constb1
我总是觉得在概念上更容易想到你正在制作这个指针const(这几乎就是它的作用).
函数无法通过您给出的指针/引用更改其参数.
每次我需要考虑它时都会转到此页面:
http://www.parashift.com/c++-faq-lite/const-correctness.html
我相信Meyers的"更有效的C++"也有一个很好的篇章.