我有一本书,里面写着:
class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
};
这是什么意思?
答案 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
关键字的一些读数:
答案 1 :(得分:39)
考虑两个类型变量:
class Boo { ... };
Boo b0; // mutable object
const Boo b1; // non-mutable object
现在,您可以在Boo
上b0
调用 const
的所有成员函数,但b1
上只有{{1}}个符合条件的成员函数。
答案 2 :(得分:12)
Bar
不会更改正在调用的对象。例如,请参阅C ++常见问题解答中的section about const correctness。
答案 3 :(得分:8)
答案 4 :(得分:8)
函数不能通过你给它的指针/引用来改变它的参数。
每次我需要考虑它时都会转到此页面:
http://www.parashift.com/c++-faq-lite/const-correctness.html
我相信Meyers的“更有效的C ++”也有一个很好的篇章。
答案 5 :(得分:7)
我总是觉得在概念上更容易想到你正在制作这个指针const(这几乎就是它的作用)。