请帮我理解以下签名:
err_type funcName(const Type& buffer) const;
对于第一个
const
,是否意味着Type
的内容不能改变或者引用不能改变?
其次,第二个
const
是什么意思?
第二个 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
}
是的,第一个
const
表示buffer
不能改变。
第二个
const
暗示这是一个类的成员函数,并且不会改变对象(this
)。
这将比我们大多数人都能更好地解释,所以我不会重复: http://www.parashift.com/c++-faq-lite/const- Correctness.html
直接:这意味着const适用于调用该方法的实例。您不能在非常量对象上调用它。
const 规则: const 关键字将事物修改为其左侧,除非没有任何内容,在这种情况下,它将修改其右侧的事物。
因此,类型“const int”是一种特殊情况,其含义与“int const”相同。
当您将规则应用于方法时,您会得到“
其他示例(“从内到外读取”),其中“id”是标识符,但可以在不更改类型的情况下删除:
int const* id
=指向常量int的指针int* const id
= 指向 int 的常量指针int const id[5]
= 5x 常数 int 的数组int (*const id)[5]
= 指向 5x int 数组的常量指针更常见的是,一些人使用
T const&
和T const*
,因为它不需要特殊情况来保持一致性。我还更喜欢它,因为开始时的类型通常比知道它是常量更有帮助。
其他答案都是正确的,但它有更重要的意义。这是您的类的合同,其中规定“通过调用此函数,您将不会更改对象的状态”。人们对此有不同的解释,有些人认为对象在调用者看来不会改变外观,而另一些人则认为如果调用此函数,对象根本不会改变。
第一个
const
保证函数不会改变 buffer
,因此可以传递 const 缓冲区。
第二个
const
仅在用作类的方法时才有意义。这是保证调用该方法不会对包含该方法的类产生任何副作用。本质上保证可以在 const
对象上安全地调用此方法。
虽然您已经得到了一些很好的答案,但我认为值得指出的是,类可以包含
mutable
成员变量。 mutable
成员是您“始终”允许修改的成员,即使它是 const 对象的一部分。这些通常用于记忆和缓存等用途,可以在不影响整个对象的用户可见状态的情况下修改变量。