Что означает: mean в С++?

Возможный дубликат:
Что это за странный синтаксис столбца-члена в конструкторе?

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

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

-edit- Я чувствую себя глупо, отступ от меня. Я думал, что смотрю внутрь тела функции. Я так надеялся, что это будет что-то новое.

Ответ 1

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

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

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

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

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

Это устанавливает x в 5. Или:

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

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

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

Ответ 2

Первый двоеточие : на самом деле существует как указание на то, что следующим является список инициализаторов. Это может появиться в конструкторе класса как способ дать членам класса данных некоторое начальное значение (отсюда и имя) до того, как фактически исполнится тело конструктора.

Небольшой пример, отформатированный по-разному:

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;
};

ИЗМЕНИТЬ

В качестве дополнительной заметки, если у вас есть класс, который подклассифицирует другой, способ, которым вы вызываете свой конструктор суперкласса, точно так же, как и в списке инициализаторов. Однако вместо указания имени члена вы указываете имя суперкласса.

Ответ 3

:: относится к глобальной области. Например:

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

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

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

Ответ 4

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

class baseClass{ 
    public: 
    int someVal; 
};

class childClass : baseClass
{
    public:
    int AnotherVal;
}

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