1

我有一个有两个成员函数的类,它们的区别仅在于const修饰符。

class CFoo
{
private:
    int x;
    int y;
public:
  static int a;
  void dosmth() const {
      a = 99;
  }
  void dosmth(){
      x++;
      y++;
  }
};

int CFoo::a = 100;

int main(){
    CFoo foo;
    cout << CFoo::a << endl;
    foo.dosmth();
    cout << CFoo::a << endl;
}

以下代码打印100, 100. 为什么调用非常量 dosmth?如何const显式调用版本?

4

2 回答 2

4

为什么调用非常量 dosmth?

这是设计使然。如果您有一个非常量对象,则选择非常量重载而不是const一个。

我可以显式调用 const 版本吗?

您需要对象所在的上下文const。例如,

void dofoo(const Foo& f) { f.dosmth(); }
int main()
{
  CFoo foo;
  dofoo(foo);
  cout << CFoo::a << endl;

或者

int main()
{
  const CFoo foo1{};
  foo1.dosmth();
  CFoo foo2;
  const_cast<const CFoo&>(foo2).dosmth();
}
于 2013-08-30T11:22:21.390 回答
3

只有当对象本身是 const 时才会调用 const 版本。这意味着您可以使用以下代码调用 const 版本:

int main(){
    const CFoo foo;
    cout << CFoo::a << endl;
    foo.dosmth();
    cout << CFoo::a << endl;
}
于 2013-08-30T11:21:24.883 回答