关于const成员函数

sky*_*oor 8 c++ const const-correctness

我遇到了const成员函数的两个解释

class A{
  public:
  ...
  void f() const {}
  ...
}
Run Code Online (Sandbox Code Playgroud)
  1. 这意味着它只能访问不变成员;
  2. 这意味着它不会修改任何成员;

我认为第二个是正确的.但为什么第一个出来呢?有什么需要澄清的吗?

谢谢!

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涵盖这很好.

如果您想要更多阅读,这里有两个参考:


Ash*_*ish 5

简单来说,在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函数中更改可变数据成员.