我正在阅读J. P. Mueller和J. Cogswell的“ C ++多人傻瓜”,偶然发现:
#include <iostream>
using namespace std;
int main()
{
int ExpensiveComputer;
int CheapComputer;
int *ptrToComp;
...
此代码首先初始化所有涉及的东西-两个整数 还有一个指向整数的指针。
只需确认一下,这是一个错误,应该读“ ...通过声明”,对吗?这样的基本错误仍然在书籍中占上风,这让我感到奇怪。
答案 0 :(得分:23)
从语言的角度来看,这是default initialization。问题是,它们被初始化为不确定的值。
否则,什么也不做:具有自动存储持续时间的对象(及其子对象)被初始化为不确定的值。
具有自动和动态存储持续时间的非类变量的默认初始化产生的对象具有不确定的值(静态和线程本地对象初始化为零)
请注意,任何读取这些不确定值的尝试都会导致UB。
根据标准,[dcl.init]/7
默认初始化T类型的对象的意思是:
如果T是(可能是经过cv限定的)类类型([class]),则考虑构造函数。列举适用的构造函数 ([over.match.ctor]),并选择最佳的初始化方法() 通过过载解析([over.match])。因此,构造函数 使用空参数列表调用selected,以初始化 对象。
如果T是数组类型,则每个元素都将默认初始化。
否则,不执行初始化。
答案 1 :(得分:7)
是的,您是正确的。
您声明了并定义了这些变量,您未对其进行了初始化!
PS:What is the difference between a definition and a declaration?
答案 2 :(得分:4)
此代码同时声明和定义,但没有初始化(它们的值被确定为不确定)。
变量声明仅必须包含关键字extern
。
答案 3 :(得分:1)
对。因此,“假人”。 :)
我们甚至不能将其归咎于传统;从历史上看,C程序员会声明*一个变量,然后在其首次分配时对其进行“初始化”。
但是从来没有这样的情况,简单地声明一个没有初始化程序的变量就被认为是“初始化”了它。**
所以措辞是错误的。
*从技术上讲we're talking about definitions,但是当我们说“声明变量”时,我们几乎总是意味着定义声明。
**尽管具有静态存储持续时间的对象会在其他任何事情发生之前经历其自己的零初始化阶段,因此在这种情况下,您自己放弃初始化并不是灾难。不过,我们不能声称我们已经初始化了该对象。