constメンバ関数と、非constメンバ関数のオーバーロード

http://www.geocities.jp/ky_webid/cpp/language/020.html

ここは元記事をじっくりしっかり読むのが重要です。

とりあえず一度に沢山のことは覚えられないのでまず、戻り値がconst型についてはとりあえず置いておいて、constメンバ関数と、非constメンバ関数でのオーバーロードについて実装してみます。

#include <iostream>
using namespace std;

class CSample {
public:
    int m_num;
    CSample(int num);
    int GetNum() const;
    int GetNum();
};

CSample::CSample(int num) {
    m_num = num;
}

int CSample::GetNum() const {
    return m_num;
}

int CSample::GetNum() {
    m_num += 10;
    return m_num;
}

int main () {
    CSample obj(100);
    cout << obj.GetNum() << endl;
    return 0;
}

まず上記のようなGetNum()を実装します。そしてこの関数にはconst有り、無しでオーバーロードしています。

この場合、obj.GetNum()呼び出しはどちらのメンバ関数が呼び出されるのでしょうか?

実行してみました。

$ main
110

ということで実行結果から見るに、非constメンバ関数が呼び出されています。

ではどうやってconstメンバ関数の方を呼び出せばよいのでしょうか?そこでキャストという物が出てきます。C言語でならったキャストとはちょっと書き方が違いますが。

int main () {
    CSample obj(100);
    cout << static_cast<const CSample>(obj).GetNum() << endl;
    return 0;
}
$ main
100

constメンバ関数の方が呼び出されましたね。

とりあえず今はこのキャストの書き方に関してはスルーしましょう。多分後の章で解説があると思います。

とにかくここではconstメンバ関数と非constメンバ関数オーバーロードが可能だということが分かったので良しとします。