在这样的声明中const的含义是什么?这个常数使我困惑。
class foobar
{
public:
operator int () const;
const char* foo() const;
};
在这样的声明中const的含义是什么?这个常数使我困惑。
class foobar
{
public:
operator int () const;
const char* foo() const;
};
当前回答
布莱尔的答案是正确的。
但是请注意,有一个可变的限定符可以添加到类的数据成员中。任何标记的成员都可以在const方法中修改,而不违反const约定。
如果您希望对象记住某个特定方法被调用的次数,同时不影响该方法的“逻辑”常量,则可能需要使用这个(例如)。
其他回答
我想补充一点。
也可以将其设置为常量和常量&&
So,
struct s{
void val1() const {
// *this is const here. Hence this function cannot modify any member of *this
}
void val2() const & {
// *this is const& here
}
void val3() const && {
// The object calling this function should be const rvalue only.
}
void val4() && {
// The object calling this function should be rvalue reference only.
}
};
int main(){
s a;
a.val1(); //okay
a.val2(); //okay
// a.val3() not okay, a is not rvalue will be okay if called like
std::move(a).val3(); // okay, move makes it a rvalue
}
请随意改进答案。我不是专家
const表示该方法承诺不会更改类的任何成员。即使对象本身被标记为const,也可以执行如此标记的对象成员:
const foobar fb;
fb.foo();
将是合法的。
看看C++中“const”的用法有多少?了解更多信息。
布莱尔的答案是正确的。
但是请注意,有一个可变的限定符可以添加到类的数据成员中。任何标记的成员都可以在const方法中修改,而不违反const约定。
如果您希望对象记住某个特定方法被调用的次数,同时不影响该方法的“逻辑”常量,则可能需要使用这个(例如)。
与函数声明一起使用的const关键字指定它是一个const成员函数,它将无法更改对象的数据成员。
https://isocpp.org/wiki/faq/const-correctness#const-成员fns
什么是“常量成员函数”?检查(而不是变异)其对象的成员函数。常量成员函数由位于成员函数参数列表后面的常量后缀表示。带有常量后缀的成员函数被称为“常量成员函数”或“检查器”。没有常量后缀的会员函数称为“非常量成员函数”和“赋值函数”弗雷德班{公众:void inspect()常量;//该成员承诺不会改变*这一点void mutate();//此成员函数可能会更改*此};void userCode(Fred可更改,常量Fred不可更改){changed.inspect();//好:不更改可更改对象changed.mutate();//好:更改一个可更改的对象不可更改的.inspect();//好:不更改不可更改的对象不可更改。mutate();//错误:尝试更改不可更改的对象}试图调用不可更改的.amutate()是在编译时捕获的错误。const没有运行时空间或速度损失,您不需要编写测试用例来在运行时检查它。应使用inspect()成员函数上的尾随常量表示该方法不会更改对象的抽象(客户端可见)状态。这与表示该方法不会更改对象结构的“原始位”略有不同。C++编译器不允许采用“逐位”解释,除非它们能够解决通常无法解决的别名问题(即,可能存在一个非常量的别名,可以修改对象的状态)。这个别名问题的另一个(重要)见解是:用指向常量的指针指向对象并不能保证对象不会改变;它只是承诺对象不会通过该指针发生更改。