sky*_*oor 8 c++ const const-correctness
我遇到了const成员函数的两个解释
class A{
public:
...
void f() const {}
...
}
Run Code Online (Sandbox Code Playgroud)
我认为第二个是正确的.但为什么第一个出来呢?有什么需要澄清的吗?
谢谢!
Jam*_*son 18
您可以检查const成员函数中的所有类成员值,在某些情况下甚至可以更改成员变量的值.第一个解释是不正确的,我不知道它来自哪里.第二种解释是正确的,但有一些例外.
这条规则有一些例外.您还可以在const成员函数中更改可变变量,例如,声明为此的成员变量:
mutable float my_rank;
Run Code Online (Sandbox Code Playgroud)
你也可以通过const_cast'引用你自己来破坏类中的const-correctness,如下所示:
Class* self = const_cast<Class*> (this);
Run Code Online (Sandbox Code Playgroud)
虽然在C++中技术上允许,但这通常被认为是糟糕的形式,因为它抛弃了设计的所有const修饰符.除非你真的需要,否则不要这样做,如果你发现自己不得不这么做,这表明你的设计存在问题.在C++ FAQ涵盖这很好.
如果您想要更多阅读,这里有两个参考:
简单来说,在const函数中,您无法更改对象的状态.
在const函数中,该指针表现为const指向const数据的指针,而在非const函数中,它的行为类似于指向数据的const指针.
void foo() const --> const ClassName * const this (so you can't alter data)
void foo() --> ClassName * const this (so you can alter data)
Run Code Online (Sandbox Code Playgroud)
就const数据成员而言,您可以从任何成员函数访问(读取)它是否为const.
正如詹姆斯汤普森所表明的那样,如果你想这样,你甚至可以通过删除常数来改变对象的状态.
class Bar
{
int bar;
public:
void foo() const
{
this->bar = 0; //flashes error
Bar * const thisClass = const_cast<Bar * const>(this);
thisClass->bar = 0;
}
};
Run Code Online (Sandbox Code Playgroud)
此外,可以在const函数中更改可变数据成员.