构造函数中这个奇怪的冒号成员(“:”)语法是什么?

新手上路,请多包涵

最近我看到了一个类似下面的例子:

 #include <iostream>

class Foo {
public:
  int bar;
  Foo(int num): bar(num) {};
};

int main(void) {
  std::cout << Foo(42).bar << std::endl;
  return 0;
}

这个奇怪 : bar(num) 是什么意思?它似乎以某种方式初始化了成员变量,但我以前从未见过这种语法。它看起来像一个函数/构造函数调用,但对于 int ?对我来说没有意义。也许有人可以启发我。而且,顺便说一句,有没有像这样的其他深奥的语言特性,你在普通的 C++ 书中找不到?

原文由 nils 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 830
2 个回答

类构造函数中的冒号语法( : )是什么?将整数传递给 std::vector<> 构造函数有什么作用?

我想从 这个重复的问题 中解释以下示例:

 class UnionFind {
    public:
        UnionFind(int sz) : root(sz) {
            for (int i = 0; i < sz; i++) {
                root[i] = i;
            }
        }
    private:
        vector<int> root;
    };


    int main() {


        UnionFind uf(10);
    }

冒号 ( : ) 表示“初始化列表”或 “初始化列表” 的开始,它将每个变量初始化为括号中的值。就好像您正在为每个变量调用构造函数,括号中的值被传递给该变量的构造函数。

所以, : root(sz) 初始化 --- int sz root 变量,就像做 vector<int> root(sz); 但是,这样做允许 sz 传递给 UnionFind 类构造函数。

初始化具有这样大小的向量是构造函数#3( https://en.cppreference.com/w/cpp/container/vector/vector ):

 // Constructor (3) as shown at
// https://en.cppreference.com/w/cpp/container/vector/vector
explicit vector( size_type count,
                 const T& value = T(),
                 const Allocator& alloc = Allocator());

It constructs count ( sz in the example above) number of elements into the vector, each with value T() , which means int() in这种情况因为 rootvector<int>int() 看起来像一个函数调用,但基本上是一个整数默认构造函数,其值为零( 0 )。它被称为 “值初始化” 。如果整数是对象并且具有构造函数,则可以将其想象为调用“整数构造函数”。另请参阅我的问题: 什么是调用 char() 作为 C++ 中的函数?

So, let’s recap: : root(sz) in the constructor is like constructing vector<int> root(sz); , which creates sz number of elements in the root vector, each初始值 int() ,这是 int“值初始化” 的语法为零。

另请注意,传递给构造函数#3 的 count 参数实际上应该是 size_type ,可以写成 std::vector::size_type ,通常是 size_t (参见 此处 的“成员类型”部分)。因此,最好将 int sz 改为 size_t sz 。因此,将此构造函数行: UnionFind(int sz) : root(sz) { 改为: UnionFind(size_t sz) : root(sz) {

原文由 Gabriel Staples 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题