2012-01-17 10 views
1

他の投稿のコードを読むと、このようなものが見えます。C++の奇妙なコードセグメント

struct Foo { 
    Foo() : mem(0) {} 
    int mem; 
}; 

この場合mem(0){}は特に中括弧について何をしますか?私はこれまでこれを見たことがなく、これについて他にどこで知るか分からない。私はmem(0)を知っている、0にmemを初期化するが、なぜ{}?

ありがとうございました。

+0

[これはコンストラクタの奇妙なコロンメンバー構文ですか?](http://stackoverflow.com/questions/1711990/what-is-this-weird-colon-member-syntax-in-the -constructor) –

+0

[C++ FAQの初期化リスト](http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6) –

答えて

7

はクラスのコンストラクタであるため、メンバ変数memがその外部で初期化されていても、ボディは必要です。

Foo() : mem(0) 
{ 
    // 'mem' is already initialized, but a body is still required. 
} 
+0

このようにコードを書く必要がありますか?スタイルの問題? – rubixibuc

+1

それはスタイルの問題かもしれません。初期化リストを好む人もいれば、コンストラクタ本体の割り当てを好む人もいます。ただし、場合によっては一時的なオブジェクトの作成を避けるために、[初期化リストを使用する](http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6)が合意されています。 –

+0

いいえ、必要ありません。いくつかの人は、それがより良いパフォーマンスを持っていると言いますが、私はこの効果がまったく問題にならないと考えています。私の経験では、コンストラクタの本体のメンバーを初期化する方が良いです。デバッグを容易にします。 –

2

これは、クラスのコンストラクタを定義します。コロンの後の部分は、memメンバがコンストラクタ呼び出しを使用してゼロに初期化される初期化リストです。

が比較:

int a(0); 
int b = 0; 

をこれら二つは同じことを行うが、前者は、オブジェクトの構築は、通常、C++でどのように見えるかに沿って、より多くのです。

0

int型のC++あなたは.hファイルに

class MyClass 
{ 
    public: 
    MyClass(){ 
    ..... 
    } 

    void doSomething(){ 
    ..... 
    } 

    ~MyClass(){ 
    ..... 
    } 
}; 

をあなたのメソッドの実装を定義することができます通常は、テンプレートの実装で使用される:なぜ、あなたの例では、コンストラクタは空のボディを持っています

。また、ライブラリのリンクを避けたい場合には、このクラス宣言のメソッドを使用することができます。ユーザーはすべてのコードを自分のプロジェクトにリンクすることなくファイルに含めることができます。