1

私はいくつかの C++ を Java に移植しており、次の省略形に遭遇しました..しかし、これが何を意味するのか、またはそれをグーグルで検索する方法さえわかりません:

class mailbox {
public:
 mailbox(): sent(0),received(0),msg(0) { }

メソッドがメールボックス() の後に(?) を呼び出す意味がわかりません。

ありがとう。

4

2 に答える 2

2

これはメンバーの初期化構文です。コンストラクターの本体が始まる前に、データ メンバーを指定された値に初期化します。

非静的定数データ メンバーを初期化する C++11 より前の唯一の方法であり、コンストラクターの本体で初期化するよりも高速です。

みたいな

mailbox() {
    sent = 0;
    received = 0;
    msg = 0;
}

高速であることを除いて、const メンバーでも実行できます。実際、データ メンバーのチェックを実行する機能は提供されていませんが、それでも利用できます。

mailbox (Foo sent, Bar received, Foobar msg) : sent (0), received (0), msg (0) { //default values
    if (!setSent (sent)) 
        cout << "Error setting sent; sent is 0 instead."; //since we initialized it to 0 before
    //likewise for other members...
}
于 2012-04-21T04:48:30.690 に答える
1

sent、received、および msg が int であると仮定すると、次のようになります。

mailbox() {
    sent = 0;
    received = 0;
    msg = 0;
}

この構文が存在するのは、すべてのオブジェクトがポインターである Java とは異なり、C++ では、型がデフォルトのコンストラクターを持たないメンバー変数を持つことができるためです。例えば:

class Foo {
public:
    Foo(int x);
};

class Bar {
public:
    Bar(int x) { // ERROR, Foo does not have a default constructor
        foo = Foo(x);
    }

    Bar() : Foo(0) {} // OK, using Foo(int) instead of Foo()

private:
    Foo foo;
};

この例では、Foo にデフォルトのコンストラクターがあったとしても、Bar(int) は Foo を 2 回構築することに注意してください。

于 2012-04-21T04:56:52.937 に答える