一遍又一遍地说明,原始类型没有构造函数。例如_bar
,当我调用时,它没有初始化为0 Foo()
:
class Foo{
int _bar;
};
因此显然int()
不是构造函数。但是,什么是它的名字?
在此示例中,我想说的i
是:(构造?已初始化?被愚弄?)
for(int i{}; i < 13; ++i)
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;
}
在Visual Studio 2013上运行此代码会产生:
3382592
3382592
有趣的是,在gcc 4.8.1上得出:
134514651
0
一遍又一遍地说明,原始类型没有构造函数。
这是正确的。
例如,当我打电话时,此栏未初始化为0
Foo()
是的。Foo()
指定值初始化,对于没有用户提供的构造函数的此类类,它意味着在初始化其成员之前将其初始化为零。因此_bar
最终的值为零。(尽管如注释中所述,一个流行的编译器没有正确对此类进行值初始化。)
如果要使用默认初始化,则不会被初始化。您不能临时做到这一点;但是声明的变量Foo f;
或对象new F
将被默认初始化。基本类型的默认初始化不执行任何操作,使它们具有不确定的值。
如果该类具有用户提供的默认构造函数,并且该构造函数没有专门初始化,则也不会初始化它_bar
。同样,它将被默认初始化,没有任何效果。
因此显然int()不是构造函数。但是它叫什么名字呢?
作为表达式,它是type的值初始化的临时值int
。
从句法上讲,这是“显式类型转换(函数表示法)”的特例;但是使用该术语进行类型转换以外的其他操作会造成混乱。
在此示例中,我想说的
i
是:(构造?已初始化?被愚弄?)
已初始化。如果要更具体,请进行列表初始化(带有空列表),值初始化或零初始化。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句