const の活用 解答ページ | Programming Place Plus C++編【言語解説】 第15章

トップページC++編

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 と更新されており、今後も 3年ごとに更新されます。
なかでも C++11 での更新は非常に大きなものであり、これから C++ の学習を始めるのなら、C++11 よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。

問題①

問題① 次のようなメンバ関数は適切と言えるでしょうか?

class DataStore {
public:
    inline int* GetValue() const
    {
        return &mValue;
    }

private:
    int    mValue;
};


Student::GetValue関数は constメンバ関数ですが、返しているのはメンバ変数^へのポインタになっており、このポインタには const が付いていません。こういうメンバ関数を作ってしまうと、次のような使い方ができてしまいます。

DataStore* dataStore = new DataStore();
int* p = dataStore->GetValue();
*p = 100;

これでは、constメンバ関数とすることで、メンバを書き換えられないようにしていることに意味がありませんし、何より、カプセル化の観点からいって、メンバ関数を経由せずにメンバ変数を書き換えられるのは適切でありません。

もし、Student::GetValue関数の戻り値が constポインタであったとしても、メンバ関数を経由せずにメンバ変数を直接参照できることに変わりはないので、やはり避けるべきです。こういう場面では、ポインタや参照ではなく、実体のコピーを返すようにするべきでしょう。


参考リンク


更新履歴

’2018/9/10 第18章と内容を入れ替えた(以下の履歴は、旧第18章のもの)

’2014/9/22 新規作成。



第15章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る