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的指针int const*id
= 指向int的常量指针int*const id
= 5x常量int数组int const id[5]
= 指向5x int数组的常量指针int(*const id)[5]
更常见的是,
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
}