Jon*_*Mee 15 c++ primitive construction initialization nomenclature
它已被反复重复,原始类型没有构造函数.例如_bar,当我调用时,这不会初始化为0 Foo():
class Foo{
int _bar;
};
Run Code Online (Sandbox Code Playgroud)
所以显然int()不是构造函数.但它的名字是什么?
在这个例子中我会说i:(构造?初始化?fooed?)
for(int i{}; i < 13; ++i)
Run Code Online (Sandbox Code Playgroud)
Loki Astari 在这里提到该技术有某种名称.
编辑回应Mike Seymour:
#include <iostream>
using namespace std;
class Foo{
int _bar;
public:
void printBar(){ cout << _bar << endl; }
};
int main()
{
Foo foo;
foo.printBar();
Foo().printBar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Visual Studio 2013上运行此代码产生:
3382592
3382592
有趣的是gcc 4.8.1收益率:
134514651
0
它已被反复重复,原始类型没有构造函数.
那就对了.
例如,当我打电话时,此栏未初始化为0
Foo()
是的.Foo()指定value-initialisation,对于没有用户提供的构造函数的类,这意味着它在初始化其成员之前是零初始化的.因此_bar最终得到零值.(尽管如评论中所述,一个流行的编译器没有正确地初始化这些类.)
如果您使用默认初始化,则不会初始化.你暂时无法做到这一点; 但是声明的变量Foo f;或对象new F将被默认初始化.原始类型的默认初始化没有任何作用,使它们具有不确定的值.
如果类具有用户提供的默认构造函数,并且该构造函数没有专门初始化,那么它也不会被初始化_bar.同样,它将默认初始化,没有任何效果.
所以显然int()不是构造函数.但它的名字是什么?
作为表达式,它是类型初始化的临时类型int.
从语法上讲,它是"显式类型转换(功能表示法)"的特例; 但是将该术语用于类型转换以外的任何事情都会让人感到困惑.
在这个例子中我会说
i:(构造?初始化?fooed?)
初始化.列表初始化(使用空列表),值初始化或零初始化,如果您想更具体.
这是什么int()(记住,在语法上,int是一个简单类型说明符):
[C++11: 5.2.3/1]:甲简单型说明符(7.1.6.2)或类型名称说明符后跟带括号的(14.6)表达式列表构建体给出的表达式列表中指定的类型的值.如果表达式列表是单个表达式,则类型转换表达式与相应的强制转换表达式(5.4)等效(在定义中,如果在含义中定义).如果指定的类型是类类型,则类类型应完整.如果表达式列表指定多个值,则该类型应为具有适当声明的构造函数的类(8.5,12.1),并且该表达式T(x1, x2, ...)与声明的效果等效T t(x1, x2, ...); 对于一些发明的临时变量t,结果是t作为prvalue 的值.
通俗地讲,它代表了一个int带有空初始化器的临时构造.不过,我认为你很难找到整个结构的正式名称.
这与使用初始化器的命名对象int i{}的完整声明不同:您i已声明,构造和初始化.
(我不认为这与Loki在对该相关答案的评论中所说的内容有关.)
| 归档时间: |
|
| 查看次数: |
2193 次 |
| 最近记录: |