1. ホーム
  2. c++

[解決済み] C++のクラスメンバは、明示的に初期化しない場合、どのように初期化されるのですか?

2022-04-14 05:49:23

質問

プライベートメンバーを持つクラスがあるとします。 ptr , name , pname , rname , crnameage 自分で初期化しない場合はどうなるのですか?以下はその一例です。

class Example {
    private:
        int *ptr;
        string name;
        string *pname;
        string &rname;
        const string &crname;
        int age;

    public:
        Example() {}
};

そして、そうする。

int main() {
    Example ex;
}

exでは、メンバーはどのように初期化されるのですか?ポインターの場合はどうなるのですか?する stringint デフォルトコンストラクタで0初期化される string()int() ? 参照メンバはどうする?また、constリファレンスについてはどうでしょうか?

より良い(バグのない)プログラムを書けるように、勉強したいと思います。何かフィードバックがあれば助かります

どのように解決するのですか?

明示的な初期化の代わりに、クラス内のメンバの初期化は、関数内のローカル変数の初期化と同じように動作します。

については オブジェクト の場合、そのデフォルトコンストラクタが呼び出されます。例えば std::string の場合、デフォルトコンストラクタはこれを空文字列に設定します。オブジェクトのクラスにデフォルトコンストラクタがない場合、明示的に初期化しないとコンパイルエラーになります。

については プリミティブ型 (ポインタ、ints など) の場合、それらは ない 初期化され、以前そのメモリ位置にあった任意のジャンクが格納されます。

については リファレンス (例 std::string& ) の場合、それは 違法 を初期化しないと、コンパイラは文句を言って、そのようなコードのコンパイルを拒否します。参照は常に初期化されなければなりません。

つまり、あなたの具体的なケースでは、明示的に初期化されていない場合。

    int *ptr;  // Contains junk
    string name;  // Empty string
    string *pname;  // Contains junk
    string &rname;  // Compile error
    const string &crname;  // Compile error
    int age;  // Contains junk