C++ c++;在签名中使用常量的含义

C++ c++;在签名中使用常量的含义,c++,constants,C++,Constants,请帮助我理解以下签名: err_type funcName(const Type& buffer) const; 那么对于第一个常量,这是否意味着类型的内容不能更改,或者引用不能更改 第二,第二个常量是什么意思?我甚至连一个暗示都没有 提前感谢,, jbu第二个常量意味着可以对常量对象调用该方法 考虑这个例子: class foo { public: void const_method() const; void nonconst_method(); }; void

请帮助我理解以下签名:

err_type funcName(const Type& buffer) const;
那么对于第一个常量,这是否意味着类型的内容不能更改,或者引用不能更改

第二,第二个常量是什么意思?我甚至连一个暗示都没有

提前感谢,,
jbu

第二个常量意味着可以对常量对象调用该方法

考虑这个例子:

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方法不允许更改对象的任何成员(除非该成员被特别标记为mutable):


直接:这意味着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*
被一些人使用,因为它不需要特殊情况来保持一致性。另外,我更喜欢它,因为开始时的类型通常比知道它是常量更有用。

是的,第一个
常量
意味着
缓冲区
不能更改


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

这比我们大多数人可能解释得更好,所以我不再重复:
其他答案是正确的,但它有更重要的意义。它是类的约定,表示“通过调用此函数,您将不会更改对象的状态”。人们对此的理解有所不同,一些人认为调用方不会改变对象的外观,而另一些人认为调用此函数时对象根本不会改变。

第一个
常量是保证函数不会改变
缓冲区,因此可以传递一个常量缓冲区


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

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

准确地说,“不会对包含该方法的类产生任何影响”应该重新编写。常量方法可以更改类的静态成员,但必须保持不变的是调用该方法的实例。并且您可能不应该拥有类的可变成员。可变成员非常有用。编译器只强制按位常量——这意味着对象的实际位不能更改。但是,如果对象的逻辑状态不受更改的影响,则应将该项声明为可变的。例如,如果我有一个查询数据库的对象,那么const对象允许对其自身进行select查询是有意义的。但是,在运行一个函数时,可能需要修改一个“数据库”连接对象,它可以在其他查询中重用,在这种情况下,<代码>可变的可以帮助您维护逻辑const——这是一件好事。在使用C++的金融工具定价中,我可以看到正常函数签名中的第二个常数,不是类成员方法。那是什么意思?
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
}