明示的に初期化しない場合、クラスメンバーはどのように初期化されますか? 質問する

明示的に初期化しない場合、クラスメンバーはどのように初期化されますか? 質問する

ptrプライベート メンバー、、、、およびを持つクラスがあるとします。自分で初期化しないとどうnameなるでしょpnameうか? 次に例を示します。rnamecrnameage

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

    public:
        Example() {}
};

そして私はこうします:

int main() {
    Example ex;
}

ex ではメンバーはどのように初期化されますか? ポインターの場合はどうなりますか? を実行しstring、デフォルトのコンストラクターとintを使用して 0 で初期化されますか? 参照メンバーはどうですか? また、const 参照はどうですか?string()int()

より良い(バグのない)プログラムを書くためにこれを学んでいきたいです。どんなフィードバックでも助かります!

ベストアンサー1

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

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

のためにプリミティブ型(ポインタ、intなど)はない初期化されたファイルには、そのメモリ位置に以前あった任意のジャンクデータがすべて含まれています。

のために参照(例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

おすすめ記事