声明、定义、初始化与赋值
为了将程序拆分成多个逻辑部分来编写,C++语言支持分离式编译机制。它允许我们将程序分割为多个文件,每个文件可以独立编译,最后通过链接器来链接在一起形成一个完整的程序。
为了支持分离式编译机制,C++将声明(declaration)与定义(definition)区分开来。有一部分语言并不将两者做严格的区分,而C/C++却做了区分,二者含义也有很大的不同。还有容易混淆的初始化与赋值,下面给出每个名词的描述。
- declaration
声明说明了变量的名字和类型,但并不分配存储空间。 - definition
定义也说明了变量的名字和类型,而且还为它分配了存储空间。并不一定要填充初始值 - initialization
初始化是一种特殊的定义,初始化 = 定义的同时并赋初始值。 - assignment
将某一个数值赋给一个变量的过程,赋值只针对于已分配存储空间的的变量而言。可以多次进行。在对类成员变量在构造函数内部赋值和在初始值列表中初始化而言,二者具有一些差异,这会影响程序的效率。
变量能且只能被定义一次,但是可以被多次声明
任何包含了显示初始化的声明即成为了定义。如果想对一个变量进行声明那么就在变量前加extern关键字,而且不要显示的初始化变量
- 例1:
extern int i;//声明i
int j;//声明并定义i
extern double x = 3.14;//包含了显示的初始化,声明变为定义
- 例2
int i = 0;//初始化(定义)
i = 100;//赋值
- 例3
extern int i;//声明i,不分配内存
int main(void)
{
/*
/tmp/ccUFFnPW.o: In function `main':
test.cc:(.text+0x6): undefined reference to `i'
collect2: error: ld returned 1 exit status
*/
i = 0;//error,由于赋值只针对于已分配内存变量而言,而i只是声明了但是没有分配内存所以报错。
return 0;
}
- 例4
//对于全局的,静态的未初始化的变量,编译器将其默认初始化为0
//对于局部变量(栈变量)不做默认处理,所以里面是垃圾值
#include <iostream>
using namespace std;
int i;//被初始化为0
int main()
{
static int j;//被初始化为0
int k;//垃圾值
cout << i << " " << j << " " << k << endl;
return 0;
}
参考文献
《C++ primer》 5th 中文版