C++ 构造函数语法和零初始化

C++ constructor syntax and zero-initialization

这是一个关于 c++ 语法的小问题:

class arrayInit {
 public:
  bool vars[2];

  arrayInit() : vars() {} //1
};

class array {
 public:
  bool vars[2];
  array() {} //2
};

1 和 2 是做什么的?

为什么他们不像这样进行零初始化:bool vars[2]={};?

arrayInit() :array() 的目的是什么?它叫什么,所以我可以搜索它?

来自:https://msujaws.wordpress.com/2010/06/16/initializing-an-array-in-c/

arrayInit()array() 都是默认构造函数。如果缺少默认构造函数而其他构造函数可用,则不能在不调用其他构造函数的情况下从该 class 类型声明对象,例如如果没有默认构造函数,你不能这样做 arrayInit arr;

: vars()部分称为初始化列表。您可以在 link 中阅读更多关于它们的信息:http://en.cppreference.com/w/cpp/language/initializer_list

What does 1 and 2 do?

1 和 2 都为各自的类型定义了默认构造函数

Why they don't zero initialize like this: bool vars[2]={};?

如果他们使用支持 c++11 的编译器,他们可以。另外 var() 将 value 初始化 与 vars[2] = {} 相同的数组将显式初始化所有元素为 false

What is the purpose of arrayInit() : and array()? and what is it called so I could search for it?

它们被称为默认构造函数。 C++ 编译器会为你创建它们,除非你想对它们做一些特殊的事情。如果您提到的是写在 :(冒号)之外的内容,则该表达式称为 initializer list

阅读更多here

What does 1 and 2 do?

两者都允许您覆盖数组的默认初始化。 InitArray 专门初始化没有参数的 vars 数组,我相信它会假设 0 作为默认参数。 Array 并没有专门初始化数组,所以它会退回到默认的初始化情况。

Why they don't zero initialize like this: bool vars[2]={};?

您可以这样做,这只是将 bool 数组封装在 class 中的另一个选项,以便您可以根据需要提供其他功能。

What is the purpose of arrayInit() : and array()?

如果需要默认功能,则无需将数组封装在自己的 class 中。封装允许您封装一个类型以提供与默认功能不同的功能,您可以继续添加加法、减法或任何您能想到的方法,并让它以您指定的方式执行这些方法。

and what is it called so I could search for it?

问得好;封装,class初始化,数组初始化。

http://www.cplusplus.com/doc/tutorial/classes/