2011-01-17 6 views
10

Можно создать дубликат:
What is this weird colon-member syntax in the constructor?Что означает: :: mean на C++?

Я думал, что я знал, что все, но что-то всегда кажется всплывал. Может быть, я что-то забываю. Что означает : ::name? Я подозреваю, что ::google средства из глобального пространства имен используют google, protobuf, message. Но что делает : перед этим? Нет текста слева, поэтому он не может быть ярлыком (или может быть ?!). Так что это?

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

нет, я проголосовал, потому что ты не ответил на мой вопрос. > «Что означает: :: name?» И «Но что делает: делать до этого?» –

19

В конструкторе использование двоеточия используется для инициализации переменной и/или вызова родительского конструктора. Например:

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

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

Теперь вы можете сделать конструктор бара так:

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

, что устанавливает х до 5. Или:

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

Это использует второй конструктор Foo с 8 как аргумент, затем устанавливает x в 3.

Это выглядит просто забавно в коде, поскольку у вас есть комбинация : для инициализации и :: для доступа к глобальному пространству имен.

+0

Я чувствую себя глупо, я думал, что искал внутри тела функции. +1 и принято. –

+2

Нет причин чувствовать себя глупо. Я видел много вещей, которые заставили меня сделать двойной прием сначала. Некоторые языки программирования могут действительно испортить ваш ум :) – EboMike

+0

благодарит EboMike за полный и ясный комментарий. – Chavoosh

3

Кажется, что он работает с наследованием, распространяясь от глобального пространства имен.

class baseClass{ 
    public: 
    int someVal; 
}; 

class childClass : baseClass 
{ 
    public: 
    int AnotherVal; 
} 

Другие ответы, представленные позже, являются более надежными.

Смежные вопросы