usu*_* me 4 c++ int constructor
我正在学习C++,我对int变量的初始化感到有点困惑.
这段代码(包括注释)是Nawaz在本主题中的答案的复制/粘贴为什么C++需要用户提供的默认构造函数来默认构造一个const对象?
struct POD
{
int i;
};
POD p1; //uninitialized - but don't worry we can assign some value later on!
p1.i = 10; //assign some value later on!
POD p2 = POD(); //initialized
Run Code Online (Sandbox Code Playgroud)
对于p2,我了解到以下情况:
但是,评论说p2已初始化!欢迎任何解释.谢谢.
对于像int这样的内置类型,隐式默认构造函数不执行任何操作(不进行初始化).
这是事实,但也不是.默认初始化会导致单元化对象,而值初始化则不会.
如果没有为对象指定初始化程序,则默认初始化该对象; 如果未执行初始化,则具有自动或动态存储持续时间的对象具有不确定的值.
如果您int i;在未初始化的整数中使用此结果!
初始值为空集括号的对象,即(),应进行值初始化.
如果你使用,int i = int();你有一个值初始化i.现在,什么是价值初始化?
对值类型T的对象进行值初始化意味着:
- [...](T可能是类或数组类型的一些选项)
- 否则,该对象被零初始化.
好的,现在我们知道这int i = int();意味着拥有i=0.
由于您的结构是POD,因此初始化值意味着对其所有成员进行初始化.
您可以在常规行为上拥有快捷方式
int i1, i2 = int();
std::cout << i1 << std::endl;
std::cout << i2 << std::endl;
Run Code Online (Sandbox Code Playgroud)
如果i1所在的内存不是任何运气,那么输出可能就是
somevalue 0
[ 正如@jogojapan正确提到的那样:首先读取i1是未定义的,所以不要这样做.你很可能会观察我在这里所描述的内容,但由于标准没有强制编译器以这种方式表现,因此i1可能为零,或以任何其他奇怪的方式制止预期结果.]
请注意以下事项:
注意:由于初始化程序的语法不允许(),
X a();不是类X的值初始化对象的声明,而是函数的声明,不带参数并返回X.
强调标准报价是我的.
| 归档时间: |
|
| 查看次数: |
3425 次 |
| 最近记录: |