2

const 成员函数是否只调用 const 成员函数?

class Transmitter{
  const static string msg;
  mutable int size;
  public: 
    void xmit() const{
    size = compute();
    cout<<msg;
  }
  private:
   int compute() const{return 5;}
};

 string const Transmitter::msg = "beep";

 int main(){
   Transmitter t;
   t.xmit();
   return EXIT_SUCCESS;
 }

如果我不将 compute() 设为 const,则编译器会抱怨。是不是因为不允许 const 成员函数修改成员,所以它不允许任何对非常量的调用,因为这意味着 const 成员函数将“间接”修改数据成员?

4

5 回答 5

5

是不是因为不允许 const 成员函数修改成员,所以它不允许任何对非常量的调用,因为这意味着 const 成员函数将“间接”修改数据成员?

是的。

于 2011-01-06T11:40:50.820 回答
3

是的:const成员函数只看到const类的版本,这意味着编译器不会const在成员函数中找到任何非成员(数据或函数)const

这种影响传播到const类的对象(实例),其中只有const成员是可访问的。

如果应用得当,const将允许程序员检查他对类的使用,并确保不会对任何不应更改的对象进行不必要的更改。

于 2011-01-06T11:41:28.707 回答
1

是的。当你调用 'xmit()' 时,它的 'this' 指针将为 const,这意味着你不能从那里调用非 const 方法,因此 'compute()' 必须是 const

于 2011-01-06T11:44:59.187 回答
1

正如其他人所说;是的。

如果有特定原因希望计算为非 const,例如,如果它使用一些本地缓存来存储计算,那么您仍然可以通过声明 const 版本从声明为 const 的其他函数调用它

  private:
       int compute() const{return ( const_cast<Transmitter*>(this)->compute());}
       int compute() {return 5;}
于 2011-01-06T11:49:38.043 回答
1

你的断言和分析都是正确的。

于 2011-01-06T11:50:11.533 回答