什么:::在C++中意味着什么?

10 c++ syntax

可能重复:
构造函数中这个奇怪的冒号成员语法是什么?

我以为我知道一切,但总会出现一些东西.也许我忘了什么.什么: ::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.

它只是在您的代码中看起来很有趣,因为您具有:初始化和::获取全局命名空间的组合.

  • 没理由感到愚蠢.我看到很多事情让我一开始就做了双重拍摄.一些编程语言真的可以搞乱你的想法:) (2认同)

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)

编辑

另外需要注意的是,如果你有一个继承另一个类的类,那么在初始化列表中调用你的超类构造函数的方式就是这样.但是,您不必指定成员的名称,而是指定超类的名称.


Eti*_*tel 7

::指全球范围.例如:

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

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

    void g()
    {
        f(); // calls (2)
        ::f(); // calls (1)
    }
}
Run Code Online (Sandbox Code Playgroud)