Help us understand the problem. What is going on with this article?

POD 型のデフォルト初期化

プログラミング言語 C++ において変数の宣言や new 式でコンストラクタに渡す引数が空の場合は引数リストを省略できます。 つまり、空の引数リストは書いても書かなくても挙動に差はありません。

class foo {
    // 省略
};

int
main(void) {
    // ↓ どっちでも同じ
    foo a;
    foo b{};

    // ↓ どっちでも同じ
    foo *c = new foo;
    foo *d = new foo();

    return 0;
}

しかしこの挙動には例外があります。 スカラ型や POD 型です。

POD (Plain Old Data) の厳密な定義はここでは述べませんが、おおざっぱに言えば C の構造体と互換性があるような型です。

#include <iostream>

// POD 型の定義
class foo {
public:
    int data;
};

int main(void) {
    static_assert(std::is_pod<foo>::value == true, "foo is not POD"); // 型 foo が POD 型であることを確認

    foo a;   // コンストラクタは呼び出されない
    foo b{}; // コンストラクタが呼び出される

    foo *c = new foo;   // コンストラクタは呼び出されない
    foo *d = new foo(); // コンストラクタが呼び出される

    std::cout << a.data << std::endl; // 初期化されていないので不定。 未定義なのでやっちゃだめ!
    std::cout << b.data << std::endl; // 0に初期化されている

    std::cout << c->data << std::endl; // 初期化されていないので不定。 未定義なのでやっちゃだめ!
    std::cout << d->data << std::endl; // 0に初期化されている

    return 0;
}

定義した型が意図せず POD の要件を満たした場合 (そんなことはあまりありそうにないですが) にこの規則によってうっかり初期化漏れなどということがないように気を付けましょう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした