请帮我理解以下签名:
err_type funcName(const Type& buffer) const;
所以对于第一个const,这是否意味着Type的内容不能改变或者引用不能改变?
其次,第二个const是什么意思?我甚至没有暗示。
提前致谢, JBU
答案 0 :(得分:18)
第二个const意味着可以在const对象上调用该方法。
考虑这个例子:
class foo
{
public:
void const_method() const;
void nonconst_method();
};
void doit()
{
const foo f;
f.const_method(); // this is okay
f.nonconst_method(); // the compiler will not allow this
}
此外,不允许const方法更改对象的任何成员(除非该成员被特别标记为可变):
class foo
{
public:
void const_method() const;
private:
int r;
mutable int m;
};
void foo::const_method() const
{
m = 0; // this is okay as m is marked mutable
r = 0; // the compiler will not allow this
}
答案 1 :(得分:5)
是的,第一个const
表示buffer
无法更改。
第二个const
意味着这是一个类的成员函数,不会更改对象(this
)。
答案 2 :(得分:4)
这将比我们大多数人解释得更好,所以我不会重复: http://www.parashift.com/c++-faq-lite/const-correctness.html
答案 3 :(得分:3)
直接:这意味着const适用于调用该方法的实例。您不能在非const对象上调用它。
const规则: const关键字将事物修改为 left ,除非没有任何内容,在这种情况下它会修改到右边的东西。
因此,类型“const int”是一种特殊情况,与“int const”相同。
将规则应用于方法时,您会得到“< method> const”。 (这是一种延伸,但仍然有助于理解这种方式。)
其他示例(“从里到外读取”),其中“id”是标识符,但可以在不更改类型的情况下删除:
int const* id
=指向常量int int* const id
=指向int的常量指针int const id[5]
= 5x constant int int (*const id)[5]
=指向5x int数组的常量指针更常见的是,T const&
和T const*
被某些人使用,因为它不需要特殊情况就能保持一致性。我更喜欢它,因为一开始的类型通常比知道它的常量更有帮助。
答案 4 :(得分:2)
其他答案是正确的,但它具有更重要的意义。这是你班级的合同,“通过调用此函数,你不会改变你的对象的状态”。人们对此有不同的解释,有些人将其视为对象不会在外观上改变为调用者,而其他人则认为对象在调用此函数时根本不会改变。
答案 5 :(得分:0)
第一个const
是保证函数不会更改buffer
,因此可以传递一个const缓冲区。
第二个const
仅在用作类的方法时才有意义。保证调用该方法对包含该方法的类没有任何副作用。基本上是一种保证,可以在const
个对象上安全地调用此方法。
答案 6 :(得分:0)
虽然你已经得到了一些好的答案,但我认为有必要指出一个类可以包含mutable
个成员变量。 mutable
成员是您总是允许修改的成员,即使它是const对象的一部分。这些通常用于记忆和缓存之类的事情,其中变量可以被修改而不会影响整个对象的用户可见状态。