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

Joh*_*son 24 c++ terminology initialization declaration language-lawyer

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

#include <iostream>
using namespace std;
int main()
{
    int ExpensiveComputer;
    int CheapComputer;
    int *ptrToComp;
...
Run Code Online (Sandbox Code Playgroud)

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

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

son*_*yao 23

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

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

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

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

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

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

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

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

  • 否则,不执行初始化.

  • @MaximEgorushkin - 这可能是正式的,但你不能编写一个可以判断在这些情况下是否发生了内存存储的符合程序,所以as-if规则说它们是相同的. (5认同)
  • _initialized与不确定的value_和_not initializated_之间存在一个至关重要的区别:前者需要内存存储,后者则不需要. (2认同)

gsa*_*ras 7

是的,你是对的.

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

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