initialize,define之间的区别是声明一个变量

Ton*_*ony 64 c c++ terminology

在阅读问题后,我知道声明和定义之间的区别.那么这意味着定义等于声明加初始化吗?

Sho*_*hoe 79

宣言

通常,声明是指在程序中引入新名称.例如,您可以通过描述它的"签名" 来声明一个新函数:

void xyz();
Run Code Online (Sandbox Code Playgroud)

或声明不完整的类型:

class klass;
struct ztruct;
Run Code Online (Sandbox Code Playgroud)

并且最后但并非最不重要的是,声明一个对象:

int x;
Run Code Online (Sandbox Code Playgroud)

在C++标准中,它在§3.1/ 1中描述为:

声明(第7条)可以将一个或多个名称引入翻译单元或重新声明先前声明引入的名称.

定义

定义是先前声明的名称的定义(或者它可以是定义和声明).例如:

int x;
void xyz() {...}
class klass {...};
struct ztruct {...};
enum { x, y, z };
Run Code Online (Sandbox Code Playgroud)

具体而言,C++标准将其定义为§3.1/ 1,如下:

声明是一个定义,除非它声明一个函数而没有指定函数的主体(8.4),它包含extern说明符(7.1.1)或linkage-specification25(7.5),既不是初始化器也不是函数体,它声明了类定义中的静态数据成员(9.2,9.4),它是一个类名声明(9.1),它是一个opaque-enum-declaration(7.2),它是一个模板参数(14.1),它是一个参数 - 函数声明符中的声明(8.3.5),它不是函数定义的声明符,或者是一个typedef声明(7.1.3),一个别名声明(7.1.3),一个using声明(7.3. 3),static_assert声明(第7条),属性声明(第7条),空声明(第7条)或使用指令(7.3.4).

初始化

初始化是指在施工时"价值"的"赋值".对于类型的通用对象T,它通常采用以下形式:

T x = i;
Run Code Online (Sandbox Code Playgroud)

但在C++中它可以是:

T x(i);
Run Code Online (Sandbox Code Playgroud)

甚至:

T x {i};
Run Code Online (Sandbox Code Playgroud)

用C++ 11.

结论

那么这意味着定义等于声明加初始化吗?

这取决于.关于你在说什么.如果您正在谈论一个对象,例如:

int x;
Run Code Online (Sandbox Code Playgroud)

这是一个没有初始化的定义.相反,以下是初始化的定义:

int x = 0;
Run Code Online (Sandbox Code Playgroud)

在某些情况下,谈论"初始化","定义"和"声明"是没有意义的.例如,如果您正在讨论函数,那么初始化并不意味着什么.

所以,答案是没有:定义并不自动意味着申报加初始化.

  • 不完全:`int x;`是一个定义和一个声明. (10认同)
  • @Angew,谢谢,我添加了更完整的*定义*。 (3认同)
  • @Tony我认为(如果我错了,请有人纠正我,以便我学习)'extern int x'只是一个声明,意味着该定义在其他地方可以找到。尽管“ int x”实际上是用随机垃圾值指定的,但实际上是对其进行定义的,除非您特别将其初始化为“ int x = 5”。 (2认同)

Lig*_*ica 33

宣言说"这件事存在于某处":

int foo();       // function
extern int bar;  // variable
struct T
{
   static int baz;  // static member variable
};
Run Code Online (Sandbox Code Playgroud)

定义说"这里存在这个东西;为它做记忆":

int foo() {}     // function
int bar;         // variable
int T::baz;      // static member variable
Run Code Online (Sandbox Code Playgroud)

初始化在对象的定义时是可选的,并且说"这是这个东西的初始值":

int bar = 0;     // variable
int T::baz = 42; // static member variable
Run Code Online (Sandbox Code Playgroud)

有时它可能在声明时代替:

struct T
{
   static int baz = 42;
};
Run Code Online (Sandbox Code Playgroud)

......但是这会进入更复杂的功能.


Cro*_*man 8

对于 C,至少,根据 C11 6.7.5:

声明指定了一组标识符的解释和属性。标识符的定义是对该标识符的声明:

  • 对于一个对象,导致为该对象保留存储空间;

  • 对于函数,包括函数体;

  • 对于枚举常量,是标识符的(唯一)声明;

  • 对于 typedef 名称,是标识符的第一个(或唯一)声明。

根据 C11 6.7.9.8-10:

初始值设定项指定存储在对象中的初始值...如果具有自动存储的对象未显式初始化,则其值是不确定的。

因此,从广义上讲,声明引入了一个标识符并提供了有关它的信息。对于变量,定义是为该变量分配存储空间的声明。

初始化是对要存储在对象中的初始值的规范,这不一定与您第一次显式为其赋值相同。一个变量在定义时就有一个值,无论你是否明确地给它一个值。如果你没有明确地给它一个值,并且这个变量有自动存储,它会有一个初始值,但那个值是不确定的。如果它有静态存储,它将根据类型隐式初始化(​​例如,指针类型被初始化为空指针,算术类型被初始化为零,等等)。

因此,如果您定义了一个自动变量而不为其指定初始值,例如:

int myfunc(void) {
    int myvar;
    ...
Run Code Online (Sandbox Code Playgroud)

您正在定义它(因此也声明它,因为定义是声明),而不是初始化它。因此,定义不等于声明加初始化。