[解決済み] メンバーデフォルト値ベストプラクティス
2023-04-06 10:51:45
質問内容
C++11 のコードを書くとき、クラスのヘッダー ファイルでクラス メンバのデフォルト値を設定するのはよい習慣ですか。
それとも、クラスのコンストラクターで行う方が良いのでしょうか?
EDITです。
つまり
foo.h :
#include <string>
using std::string;
class Foo{
private:
string greet = "hello";
public:
Foo();
};
VS
foo.cpp (もちろん必要なヘッダーファイルはありますが、クラス内初期化はありません)。
Foo::Foo(){
greet = "hello";
}
どちらが良いのか、またその理由は?
どのように解決するのですか?
クラスメンバが常に同じ初期値で初期化される場合は、初期化子をインライン化し、重複を避けるようにします。初期値がコンストラクタに依存する場合は、コンストラクタのイニシャライザリストに記載します。(そして、決してあなたのような方法で代入を使わないでください。)
例です。
class Foo
{
bool done = false; // always start like this
int qty;
Bar * p;
public:
Foo() : qty(0), p(nullptr) { }
Foo(int q, Bar * bp) : qty(q), p(bp) { }
explicit Foo(char const * s) : qty(std::strlen(s)), p(new Bar(s)) { }
// ...
};
この仮定的な例では、メンバー
done
は常に
false
として開始する必要があるので、イニシャライザはインラインで記述するのがベストです。他の2つのメンバは
qty
と
p
は、3つの異なるコンストラクタでそれぞれ異なる初期化が可能なため、コンストラクタのイニシャライザリストの中で初期化されます。
珍妙な話です。インライン・イニシャライザを提供することで、クラスが 単純なデフォルトコンストラクタ .
関連
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
-
[解決済み】静的定数文字列(クラスメンバ)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】デバッグアサーションに失敗しました