繁体   English   中英

int x; int y; int * ptr; 是不是初始化,对吧?

[英]int x; int y; int *ptr; is not initialization, right?

我正在阅读JP Mueller和J. Cogswell撰写的“C ++ All-in-One for Dummies”并偶然发现:

#include <iostream>
using namespace std;
int main()
{
    int ExpensiveComputer;
    int CheapComputer;
    int *ptrToComp;
...

这段代码首先初始化所有涉及的东西 - 两个整数和一个指向整数的指针。

只是为了确认,这是一个错误,应该读作'......通过声明',对吧? 对我来说,这样的基本错误仍然会出现在书中,这一点很奇怪。

从语言的角度来看,这是默认初始化 问题是,它们被初始化为不确定的值。

否则,什么都不做:具有自动存储持续时间的对象(及其子对象)被初始化为不确定值。

具有自动和动态存储持续时间的非类变量的默认初始化会生成具有不确定值的对象(静态和线程局部对象初始化为零)

请注意,任何读取这些不确定值的尝试都会导致UB

从标准来看, [dcl.init] / 7

默认初始化T类型的对象意味着:

  • 如果T是(可能是cv限定的)类类型([class]),则考虑构造函数。 枚举适用的构造函数([over.match.ctor]),并通过重载决策([over.match])选择初始化程序()的最佳构造函数。 使用空参数列表调用如此选择的构造函数来初始化对象。

  • 如果T是数组类型,则每个元素都是默认初始化的。

  • 否则,不执行初始化。

是的,你是对的。

声明定义这些变量,你没有初始化它们!

PS: 定义和声明有什么区别?

这段代码既声明定义了三个变量,但没有初始化它们(它们的值被认为是不确定的 )。

变量声明只能包含关键字extern

对。 因此,“假人”。 :)

我们甚至不能将这归咎于遗产; 历史上,C程序员会声明*变量,然后在第一次赋值时“初始化”它。

但是,如果没有初始化程序,简单地声明一个变量就不会被视为“初始化”它。**

所以措辞是错的。

*从技术上讲, 我们谈论的是定义 ,但当我们说“声明变量”时,我们几乎总是指定义声明。

**虽然具有静态存储持续时间的对象在其他任何事情发生之前都会经历自己的零初始化阶段,因此在这种情况下,自己进行初始化并不是一个灾难。 但是,我们不能声称我们已经初始化了该对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM