初始化,定义,声明variables之间的区别

读完这个问题后 ,我知道声明和定义之间的区别。 那么这是否意味着定义等于声明加初始化?

宣言

声明一般是指在程序中引入新名称。 例如,你可以通过描述它的“签名”来声明一个新的函数:

void xyz(); 

或者声明一个不完整的types:

 class klass; struct ztruct; 

最后但并非最不重要的是要宣布一个对象:

 int x; 

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

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

定义

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

 int x; void xyz() {...} class klass {...}; struct ztruct {...}; enum { x, y, z }; 

具体来说,C ++标准在§3.1/ 1中将其定义为:

一个声明是一个定义,除非它声明一个没有指定函数体(8.4)的函数,它包含extern说明符(7.1.1)或者一个linkage-specification25(7.5),既不是初始化也不是函数体,它声明一个类定义中的静态数据成员(9.2,9.4),类名声明(9.1),不透明枚举声明(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)。

初始化

初始化是指在施工时的价值“分配”。 对于Ttypes的通用对象,通常采用以下forms:

 T x = i; 

但是在C ++中它可以是:

 T x(i); 

甚至:

 T x {i}; 

用C ++ 11。

结论

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

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

 int x; 

这是一个没有初始化的定义。 下面是一个初始化的定义:

 int x = 0; 

在某些情况下,谈论“初始化”,“定义”和“声明”是没有意义的。 例如,如果你正在谈论一个函数, 初始化没有多大意义。

所以,答案是否定的 :定义不会自动表示声明加初始化。

宣言说“这个东西存在某处”:

 int foo(); // function extern int bar; // variable struct T { static int baz; // static member variable }; 

定义说“这里存在这个东西,记住它”:

 int foo() {} // function int bar; // variable int T::baz; // static member variable 

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

 int bar = 0; // variable int T::baz = 42; // static member variable 

有时可能在声明的地方,而不是:

 struct T { static int baz = 42; }; 

…但这是越来越复杂的function。

对于C,至less每C11 6.7.5:

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

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

  • 对于一个function,包括function体;

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

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

按C11 6.7.9.8-10:

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

所以,广义地说,一个声明引入一个标识符并提供关于它的信息。 对于一个variables,定义是为该variables分配存储的声明。

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

所以,如果你定义一个自动variables而不指定它的初始值,比如:

 int myfunc(void) { int myvar; ... 

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

“那么这意味着定义等于声明加初始化。”

不一定,你的声明可能没有任何variables被初始化为:

  void helloWorld(); //declaration or Prototype. void helloWorld() { std::cout << "Hello World\n"; }