Что означает: 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;
}
Другие ответы, представленные ниже, гораздо более надежны.