声明、定义、初始化与赋值

声明、定义、初始化与赋值

为了将程序拆分成多个逻辑部分来编写,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 
using namespace std;

int i;//被初始化为0

int main()
{
    static int j;//被初始化为0
    int k;//垃圾值
    cout << i << " " << j << " " << k <<  endl;
    return 0;
}

参考文献

《C++ primer》 5th 中文版

你可能感兴趣的:(C++)