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

时间:2014-04-28 15:48:55

标签: c++ c terminology

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

4 个答案:

答案 0 :(得分:73)

声明

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

void xyz();

或声明一个不完整的类型:

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),它是一个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;

但在C ++中它可以是:

T x(i);

甚至:

T x {i};

使用C ++ 11。

结论

  

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

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

int x;

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

int x = 0;

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

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

答案 1 :(得分:29)

宣言说“这件事存在于某个地方”:

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;
};

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

答案 2 :(得分:4)

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

  

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

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

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

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

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

  •   

每C11 6.7.9.8-10:

  

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

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

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

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

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

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

答案 3 :(得分:1)

"所以它意味着定义等于声明加初始化。"

不一定,您的声明可能没有任何变量被初始化,如:

 void helloWorld(); //declaration or Prototype.

 void helloWorld()
 {
    std::cout << "Hello World\n";
 }