变量的声明、定义和初始化有什么区别?

新手上路,请多包涵

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

原文由 Tony 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 906
2 个回答

宣言

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

 void xyz();

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

 class klass;
struct ztruct;

最后但同样重要的是,声明一个对象:

 int x;

在 C++ 标准中,第 3.11 节将其描述为:

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

定义

定义是对先前声明的名称的定义(或者它既可以是定义又可以是声明)。例如:

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

具体而言,C++ 标准在 §3.11 中将其定义为:

声明是一个定义,除非它声明一个函数而不指定函数体 (8.4),它包含 extern 说明符 (7.1.1) 或链接规范25 (7.5),既不是初始化程序也不是函数体,它声明了一个类定义中的静态数据成员 (9.2, 9.4),它是类名声明 (9.1),它是不透明枚举声明 (7.2),它是模板参数 (14.1),它是参数-函数声明器中的声明 (8.3.5) 不是函数定义的声明器,或者它是 typedef 声明 (7.1.3)、别名声明 (7.1.3)、使用声明 (7.3. 3)、静态断言声明(第 7 条)、属性声明(第 7 条)、空声明(第 7 条)或使用指令(7.3.4)。

初始化

初始化是指在构造时对值的“赋值”。对于 T 类型的通用对象,它通常采用以下形式:

 T x = i;

但在 C++ 中它可以是:

 T x(i);

甚至:

 T x {i};

使用 C++11。

结论

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

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

 int x;

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

 int x = 0;

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

所以,答案是 否定 的:定义并不意味着声明加初始化。

原文由 Shoe 发布,翻译遵循 CC BY-SA 3.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;
};

…但这涉及到更复杂的功能。

原文由 Lightness Races in Orbit 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏