这个函数签名中的const是什么意思?

问题描述 投票:0回答:7

请帮我理解以下签名:

err_type funcName(const Type& buffer) const;

对于第一个

const
,是否意味着
Type
的内容不能改变或者引用不能改变?

其次,第二个

const
是什么意思?

c++ constants
7个回答
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
}

5
投票

是的,第一个

const
表示
buffer
不能改变。

第二个

const
暗示这是一个类的成员函数,并且不会改变对象(
this
)。


4
投票

这将比我们大多数人都能更好地解释,所以我不会重复: http://www.parashift.com/c++-faq-lite/const- Correctness.html


3
投票

直接:这意味着const适用于调用该方法的实例。您不能在非常量对象上调用它。

const 规则: const 关键字将事物修改为其左侧,除非没有任何内容,在这种情况下,它将修改其右侧的事物。

因此,类型“const int”是一种特殊情况,其含义与“int const”相同。

当您将规则应用于方法时,您会得到“ 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*
,因为它不需要特殊情况来保持一致性。我还更喜欢它,因为开始时的类型通常比知道它是常量更有帮助。


2
投票

其他答案都是正确的,但它有更重要的意义。这是您的类的合同,其中规定“通过调用此函数,您将不会更改对象的状态”。人们对此有不同的解释,有些人认为对象在调用者看来不会改变外观,而另一些人则认为如果调用此函数,对象根本不会改变。


0
投票

第一个

const
保证函数不会改变
buffer
,因此可以传递 const 缓冲区。

第二个

const
仅在用作类的方法时才有意义。这是保证调用该方法不会对包含该方法的类产生任何副作用。本质上保证可以在
const
对象上安全地调用此方法。


0
投票

虽然您已经得到了一些很好的答案,但我认为值得指出的是,类可以包含

mutable
成员变量。
mutable
成员是您“始终”允许修改的成员,即使它是 const 对象的一部分。这些通常用于记忆和缓存等用途,可以在不影响整个对象的用户可见状态的情况下修改变量。

© www.soinside.com 2019 - 2024. All rights reserved.