C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 -> C++23 と更新されています。
なかでも 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 = new DataStore();
DataStoreint* p = dataStore->GetValue();
*p = 100;
これでは、constメンバ関数とすることで、メンバを書き換えられないようにしていることに意味がありませんし、何より、カプセル化📘の観点からいって、メンバ関数を経由せずにメンバ変数を書き換えられるのは適切でありません。
もし、Student::GetValue関数の戻り値が constポインタであったとしても、メンバ関数を経由せずにメンバ変数を直接参照できることに変わりはないので、やはり避けるべきです。こういう場面では、ポインタや参照ではなく、実体のコピーを返すようにするべきでしょう。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
![]() |
管理者情報 | プライバシーポリシー |