初始化数据成员的列表的正确术语是什么?

时间:2018-11-23 09:44:36

标签: c++ class oop initialization terminology

  • 一个同事说初始化列表,另一个初始化 列表
  • 一个SO answer表示初始化列表,另一个初始化 列表

正确的 * 术语是什么?

PS:他们都谈论数据成员初始化器/状态列表。


*如果正确对您不明确,则可以退回到标准术语。

3 个答案:

答案 0 :(得分:12)

  

正确的术语是什么?

“正确”含糊不清,让我们看看:

  1. 标准称之为
  2. C ++专家称呼它,
  3. vulgus称之为

标准

  

[lass.base.init]/1&2

     

1在类的构造函数的定义中,直接和虚拟基类子对象以及非静态数据成员的初始化器可以由ctor-initializer指定,其形式为

ctor-initializer:
  : mem-initializer-list

mem-initializer-list:
  mem-initializer ...opt
  mem-initializer-list , mem-initializer ...opt

mem-initializer:
  mem-initializer-id ( expression-list opt )
  mem-initializer-id braced-init-list

mem-initializer-id:
  class-or-decltype
  identifier
     

2在mem-initializer-id中,在构造函数类的范围内查找初始的不合格标识符,如果未在该范围内找到,则在包含构造函数定义的范围内进行查找。 [注意:如果构造函数的类包含与该类的直接或虚拟基类同名的成员,则命名该成员或基类并由单个标识符组成的mem-initializer-id指向该类成员。可以使用限定名称指定隐藏基类的mem-initializer-id。注释:除非mem-initializer-id命名构造函数的类,构造函数类的非静态数据成员或该类的直接或虚拟基数,否则mem-initializer的格式不正确。

它称为 mem-initializer-list :这是一个我个人不会使用的技术术语。

C ++专家

我目前正在观看CppCon2018上的演讲,这些演讲由Herb Sutter,Kate Gregory,Timur Doumler,John Lakos等人提供。。。Youtube上有此视频,我建议您也观看。

他们使用术语初始化程序列表。或者,当成员初始化程序列表不明确时。

现在,让我们比较一些搜索结果:

                               +----------------+-------------+
                               | Google scholar | Google book |
+------------------------------+----------------+-------------+
| "member initialization list" | 59 results     | 948 results |
| "member initializer list"    | 34 results     | 553 results |
+------------------------------+----------------+-------------+

在书面媒体上,这些大师(每个人都可以写论文或书,但大师往往会写更多的论文或书)在大多数情况下都称其为“成员初始化列表”。 >

普通的C ++程序员

好吧,有人不知道这是什么,我听说过有人称它为初始化程序列表。即使用我的母语讲话,我也将其称为“初始化程序列表” 。在法语中,我听说同事们称它为“初始化列表”。我想这里有些变化。

结论

将其称为初始化程序列表。这对我来说是正确的名词。

答案 1 :(得分:5)

至少到目前为止,C ++标准仅使用语法描述 mem-initializer-list ,该语法描述是解析规则的一部分。在1998年及以后的所有版本的C ++标准的标题为“初始化基础和成员”的小节中,进行了描述。节号确实发生了变化(例如,在C ++ 98中为12.6.2,在C ++ 17中为15.6.2)。

标准中没有英语说明。因此,人们通常使用他们认为代表该概念的任何措辞。

我个人使用“初始化程序列表”一词,因为我是一个会说英语的国家,而该国家的语言受到英国的影响大于美国。

答案 2 :(得分:3)

CPP标准草案N4713指出:

  

15.6.2初始化基础和成员[class.base.init]

     

3 mem-initializer-list 可以使用任何表示基类类型的class-或-decltype来初始化基类。

struct A { A(); }; 
typedef A global_A; 
struct B { }; 
struct C: public A, public B { C(); }; 
C::C(): global_A() { } // mem-initializer for base A 
     

5 ctor-initializer 可能会初始化构造函数类的变体成员。如果ctor初始化程序为相同成员或相同基类指定了多个mem初始化程序,则ctor初始化程序会格式错误。

  • Bjarne Stroustrup 在他的书“ C ++编程语言” 第4版中使用了成员初始值设定项列表

    >
  • Scott Meyers 在他的书“有效的C ++” 中使用了成员初始化列表一词。他做了使用标准中使用的术语。

  • 在线CPP常见问题解答https://isocpp.org)使用术语constructor’s initialization list