1

const修飾子だけが異なる 2 つのメンバー関数を持つクラスがあります。

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. 非 const dosmth が呼び出されるのはなぜですか? constバージョンを明示的に呼び出すにはどうすればよいですか?

4

2 に答える 2

4

非 const dosmth が呼び出されるのはなぜですか?

それは設計によるものです。非 const オブジェクトがある場合、非 const オーバーロードが選択され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 に答える