【问题标题】:What does : :: mean in C++? [duplicate]: :: 在 C++ 中是什么意思? [复制]
【发布时间】:2011-06-10 06:08:27
【问题描述】:

可能重复:
What is this weird colon-member syntax in the constructor?

我以为我什么都知道,但似乎总是会弹出一些东西。也许我忘记了什么。 : ::name 是什么意思?我怀疑::google 意味着来自全局命名空间使用googleprotobufmessage。但是: 在它之前做了什么?左边没有文字,所以它不能是标签(或者可以吗?!)。那是什么?

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

-edit- 我觉得很傻,缩进让我感到困惑。我以为我在看函数体内。我非常希望这会是新的东西。

【问题讨论】:

  • 显然是这样,而且它似乎源自 ::google::protobuf::Message。
  • 如果你不了解构造函数初始化列表这样重要的基本语言特性,那么你离“无所不知”还很远。
  • 一旦你了解了 C++ 的一切,你就已经成功了一半。一旦你意识到你只完成了一半并学习了下半部分,你就会知道那只是你实际上不知道的一半。重复...
  • @Martin:这意味着我们只能渐近地了解有关 C++ 的一切,我们永远无法真正做到。正确的? 8v)
  • @AndreyT,@Martin York:废话!缩进得到了我。我认为那部分是函数内部,因此标签注释!我觉得自己很傻,想给自己-1(但没人这样做,会发生很多倍数)

标签: c++ syntax


【解决方案1】:

第一个冒号: 实际上存在,表明后面是一个初始化列表。这可以出现在类的构造函数中,作为在构造函数的主体实际执行之前为该类的数据成员提供一些初始值(因此得名)的一种方式。

一个小例子,格式不同:

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

编辑

作为附加说明,如果您有一个类继承另一个类,则调用超类构造函数的方式与初始化器列表中的方法完全相同。但是,您无需指定成员的名称,而是指定超类的名称。

【讨论】:

    【解决方案2】:

    :: 指的是全局范围。例如:

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

    【讨论】:

    • -1 我已经知道 :: 是全球性的。它没有回答我的问题,什么是':'。
    • @acidzombie24 等等,你给我投反对票不是因为我说的是错的(事实并非如此),而是因为我告诉了你一些你已经知道的事情?
    • 不,我投了反对票,因为你没有回答我的问题。 > “::::name 是什么意思?”和“但是 : 在它之前做了什么?”
    【解决方案3】:

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

    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 并被接受。
    • 没有理由觉得自己很傻。我见过很多让我一开始就犹豫不决的事情。一些编程语言真的会让你心烦意乱:)
    • 非常感谢 EboMike 提供完整而清晰的评论。
    【解决方案4】:

    似乎正在使用继承,从全局命名空间扩展。

    class baseClass{ 
        public: 
        int someVal; 
    };
    
    class childClass : baseClass
    {
        public:
        int AnotherVal;
    }
    

    稍后提供的其他答案更加可靠。

    【讨论】:

      猜你喜欢
      • 2019-09-12
      • 2015-06-25
      • 2019-12-08
      • 2013-02-12
      • 2014-02-02
      • 2014-06-25
      • 2014-11-08
      • 2011-05-06
      • 2021-05-17
      相关资源
      最近更新 更多