可能重复:
构造函数中这个奇怪的冒号成员语法是什么?
我以为我知道一切,但总会出现一些东西.也许我忘了什么.什么: ::name意思?我怀疑::google从全局命名空间的使用方法google,protobuf,message.但:它之前做了什么呢?左边没有文字,所以它不能成为标签(或者可以吗?!).那是什么?
Namespace::Namespace()
: ::google::protobuf::Message() {
SharedCtor();
}
Run Code Online (Sandbox Code Playgroud)
-edit-我觉得很傻,这种压力让我感到高兴.我以为我正在寻找功能体内部.我当时希望这会是新事物.
Ebo*_*ike 19
在构造函数中,使用冒号用于变量初始化和/或调用父构造函数.例如:
struct foo {
foo();
foo(int var);
};
struct bar : public foo {
bar();
int x;
};
Run Code Online (Sandbox Code Playgroud)
现在你可以像这样做bar的构造函数:
bar::bar()
: x(5)
{
}
Run Code Online (Sandbox Code Playgroud)
将x设置为5.或者:
bar::bar()
: foo(8)
, x(3)
{
}
Run Code Online (Sandbox Code Playgroud)
这使用foo的第二个构造函数,其中8作为参数,然后将x设置为3.
它只是在您的代码中看起来很有趣,因为您具有:初始化和::获取全局命名空间的组合.
Daw*_*son 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;
};
Run Code Online (Sandbox Code Playgroud)
编辑
另外需要注意的是,如果你有一个继承另一个类的类,那么在初始化列表中调用你的超类构造函数的方式就是这样.但是,您不必指定成员的名称,而是指定超类的名称.
该::指全球范围.例如:
void f() { ... } // (1)
namespace ns
{
void f() { ... } // (2)
void g()
{
f(); // calls (2)
::f(); // calls (1)
}
}
Run Code Online (Sandbox Code Playgroud)