C++中的::是什么意思?

10
可能是重复问题: 构造函数中的冒号成员语法是什么意思? 我以为我知道所有的东西,但总有一些新的东西会出现。也许我忘记了某些东西。那么 : ::name 是什么意思呢?我猜 ::google 表示使用全局命名空间下的 googleprotobufmessage。但是在它前面的 : 是干什么用的?左边没有文本,所以它不能是标签(或者它可以是?!)。那它是什么呢?
Namespace::Namespace()
  : ::google::protobuf::Message() {
  SharedCtor();
}

-编辑-我感到很傻,缩进让我产生了困惑。我以为我正在查看函数体内部。我非常希望它是一些新的东西。


4
看起来是这样,而且似乎源自于::google::protobuf::Message。 - EboMike
7
如果你不了解类构造函数初始化列表这种重要的基本语言特性,那么你离“知道一切”还有很远的路要走。 - AnT stands with Russia
15
一旦你完全了解了C++,你才完成了一半。当你意识到你只完成了一半并学习了另一半时,你会发现你实际上还不知道一半。重复这个过程... - Martin York
@Fred Larson: 无限级数是一个非常酷的主题。你实际上可以把它们加起来。在这种情况下,1/2+1/4+1/8+1/16+1/32....的总和确实等于1,但只有在无限步骤之后才能实现。因此假设每个步骤都具有恒定的时间因素,你将无法在一生中完成它。但是我的断言是C ++太大/复杂了,无法了解所有内容,我总是会发现新的东西(或者被纠正我认为是真的事情并不正确,必须回去读更多关于它的内容)。 - Martin York
@LokiAstari:还有一个问题是,这是一个移动目标,因为有新的标准和供应商扩展。 - user1284631
显示剩余2条评论
4个回答

18

在构造函数中,使用冒号用于变量初始化和/或调用父类构造函数。例如:

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

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

现在您可以像这样设置bar的构造函数:

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

这会将 x 设置为 5。或者:

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

这使用了foo的第二个构造函数,并将8作为参数传递,然后将x设置为3。

在您的代码中,这看起来有点奇怪,因为您同时使用:进行初始化和::获取全局命名空间。


我感觉很傻,我以为我正在查看函数体内部。+1并接受。 - user34537
2
没有理由感到傻。我看过的很多东西一开始都让我瞪大了眼睛。某些编程语言确实会搞乱你的思维 :) - EboMike
非常感谢EboMike提供完整清晰的评论。 - Chavoosh

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

编辑

另外需要注意的是,如果你有一个继承了另一个类的子类,在初始化列表中调用超类的构造函数方式与这个例子的方式是完全一样的。不过,你需要指定超类的名称,而不是成员的名称。


7

::指全局作用域。例如:

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

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

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

-1 我已经知道 :: 是全局的。但它并没有回答我所问的,':' 是什么意思。 - user34537
@acidzombie24 等等,你给我点踩并不是因为我说错了什么(事实上我没说错),而是因为我告诉了你已经知道的东西? - Etienne de Martel
1
不,我投了反对票,因为你没有回答我的问题。"::name"是什么意思?"但是它前面的":"是做什么用的? - user34537

3
似乎在继承方面有作用,可以从全局命名空间进行扩展。
class baseClass{ 
    public: 
    int someVal; 
};

class childClass : baseClass
{
    public:
    int AnotherVal;
}

后来提供的其他答案更加强大。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接