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メンバ関数でオーバーロードが可能だということが分かったので良しとします。