c ++在签名中使用const的含义

时间:2010-01-05 23:59:51

标签: c++ const

请帮我理解以下签名:

err_type funcName(const Type& buffer) const;

所以对于第一个const,这是否意味着Type的内容不能改变或者引用不能改变?

其次,第二个const是什么意思?我甚至没有暗示。

提前致谢, JBU

7 个答案:

答案 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对象的一部分。这些通常用于记忆和缓存之类的事情,其中​​变量可以被修改而不会影响整个对象的用户可见状态。