2011-01-17 19 views
10

可能性の重複は:
What is this weird colon-member syntax in the constructor?C++では::: meanは何ですか?

私は何かが常にポップアップするようだが、私はすべてを知っていたと思いました。たぶん私は何かを忘れているかもしれない。 : ::nameは何を意味していますか?私は疑わしい::googleは、グローバル名前空間からの使用googleprotobufmessageを意味すると思われる。しかし、それ前に:は何をしていますか?それはラベルではありませんので、左にテキストがありません。それは何ですか?

Namespace::Namespace() 
    : ::google::protobuf::Message() { 
    SharedCtor(); 
} 

-edit-私は愚かな気がします。私は機能体の中を見ていると思った。私はそれが新しいものになることを期待していました。

+0

「名前空間」はクラスですか? – Naveen

+4

明らかに、それは:: google :: protobuf :: Messageから派生したようです。 – EboMike

+6

*コンストラクタ初期化子リスト*のような重要な基本言語の機能について知らないなら、あなたはまだ "すべてを知っている"から非常に遠いです。 – AnT

答えて

12

最初のコロン:は、実際には次のものがイニシャライザリストであることを示しています。これは、コンストラクタの本体が実際に実行される前に、クラスのデータメンバに初期値(したがって名前)を与える方法として、クラスのコンストラクタに現れることがあります。

小さな例、異なるフォーマット:追加の注意点としては

class Foo { 
public: 
    Foo() : 
     x(3),  // int initialized to 3 
     str("Oi!"), // std::string initialized to be the string, "Oi!" 
     list(10) // std::vector<float> initialized with 10 values 
    { /* constructor body */ } 

private: 
    int x; 
    std::string str; 
    std::vector<float> list; 
}; 

EDIT

を、あなたは別のサブクラスクラスを持っている場合、あなたはスーパークラスのコンストラクタを呼び出す方法は、まさにこのようなものですイニシャライザのリストの中にあります。ただし、メンバーの名前を指定する代わりに、スーパークラスの名前を指定します。

7

::はグローバルスコープを指します。

void f() { ... } // (1) 

namespace ns 
{ 
    void f() { ... } // (2) 

    void g() 
    { 
     f(); // calls (2) 
     ::f(); // calls (1) 
    } 
} 
+0

-1私はすでにそれがグローバルです。そして、それは私のように答えなかった、何が ':'です。 –

+0

@ acidzombie24私が言ったことは間違っている(それではない)ので、あなたがすでに知っていることを言ったので、 –

+1

いいえ、あなたが私の質問に答えなかったので私は投票しました。 >「名前はどういう意味ですか?」と「それはどうしますか? –

19

コンストラクタでは、コロンを使用すると、変数の初期化や親コンストラクタの呼び出しに使用されます。 8と、fooの二コンストラクタを使用しています

bar::bar() 
: foo(8) 
, x(3) 
{ 
} 

:例えば:

struct foo { 
    foo(); 
    foo(int var); 
}; 

struct bar : public foo { 
    bar(); 
    int x; 
}; 

今、あなたはこのようなバーのコンストラクタ行うことができます:

bar::bar() 
: x(5) 
{ 
} 

5までまたはX設定引数にxを3に設定します。

初期化は、グローバル名前空間には::を取得します。

+0

私は愚かな気がする、私は私が機能体の中を見ていると思った。 +1して受け入れます。 –

+2

愚かに感じる理由はありません。私は最初にダブルテイクをするために多くのことを見てきました。いくつかのプログラミング言語は本当にあなたの心を混乱させる可能性があります:) – EboMike

+0

完全かつ明確なコメントのために多くのEboMikeに感謝します。 – Chavoosh

3

グローバル名前空間から継承して作業しているようです。

class baseClass{ 
    public: 
    int someVal; 
}; 

class childClass : baseClass 
{ 
    public: 
    int AnotherVal; 
} 

その他の回答は、後で詳しく説明します。

関連する問題