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

3
请帮我理解以下签名:
err_type funcName(const Type& buffer) const;

第一个const是指Type的内容不能改变,还是指引用不能改变?
其次,第二个const是什么意思?
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
}

1
你的类最好不要有可变成员。 - Martin York
3
可变成员非常有用。编译器只强制执行按位const,这意味着对象的实际位不能更改。但是,如果对象的逻辑状态不受更改的影响,则应将其声明为可变的。例如,如果我有一个查询数据库的对象,那么const对象允许对它进行选择查询是有意义的。但是在运行函数时,它可能需要在内部修改“database_connection”对象,并且该对象可能会在其他查询中重复使用。在这种情况下,“mutable”有助于保持逻辑const。 - Billy ONeal
在《使用C++进行金融工具定价》一书中,我可以看到正常函数签名中的第二个常量,而不是类成员方法。那么这意味着什么? - Della

5

是的,第一个const表示buffer不能更改。

第二个const意味着这是类的成员函数,并且不会更改对象(this)。


4

3
直接:这意味着const适用于调用该方法的实例。您不能在非const对象上调用它。
const规则:const关键字修改其左侧的内容,除非没有内容,否则它将修改其右侧的内容。
因此,“const int”类型是一种特殊情况,与“int const”相同。
当您将规则应用于方法时,会得到“ const”。(这有点牵强,但仍然有助于理解。)
其他示例(“从内到外阅读”),其中“id”是标识符,但可以删除而不更改类型:
- int const* id = 指向常量int的指针 - int* const id = 常量指针,指向int - int const id[5] = 5个常量int的数组 - int (*const id)[5] = 指向5个int数组的常量指针
更常见的是,一些人使用T const&和T const*,因为它通过不需要特殊情况来保持一致性。我还喜欢它,因为起始处的类型通常比知道它是常量更有帮助。

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

0

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

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


准确来说,“不会对包含该方法的类产生任何影响”应该重新措辞。常量方法可以更改类的静态成员,但必须保持不变的是调用该方法的实例。 - David Rodríguez - dribeas

0

虽然您已经得到了一些好的答案,但我认为值得指出的是,一个类可以包含mutable成员变量。一个mutable成员是一个您始终被允许修改的成员,即使它是const对象的一部分。这些通常用于像记忆化和缓存这样的事情,其中变量可以被修改而不影响整个对象的用户可见状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接