C++ 声明、定义、初始化、赋值
参考来源:《C++ primer(第五版)》
在C++中,有以下几个概念一直都让人云里雾里。实际上,在学习语言的过程中,对每个概念了解清晰是非常重要的。
下面就让我们来理清这些概念
声明和定义
首先我们要区分 声明 和 定义 的区别。
在《C++ primer(第五版)》中写道:
C++语言支持分离式编译,该机制允许将程序分割成若干个文件,每个文件可被独立编译。
为了支持分离式编译,C++语言将声明和定义区分开来。 声明 使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明。而 定义 负责创建与名字关联的实体。
变量 声明 规定了变量的类型和名字,在这一点上定义与之相同。但是除此之外,定义 还申请存储空间,也可能会为变量赋一个初始值。
也就是说:
- 声明:只是规定了变量的类型和名字,而没有进行内存分配。
- 定义:不仅规定了变量的类型和名字,而且进行了内存分配,也可能会对量进行初始化。
显然,定义完成的任务比声明更多。并且,一个变量只有经过定义,才能够被使用。如果只有声明没有定义,那么变量将不能被使用(排除在其他文件被定义的情况)。其实也很好理解,没有内存空间的变量,可以使用么?显然不可以。
对于变量,如果我们只想声明,不想定义的话(比如在另一个文件中定义了),那么我们可以这样写:
int a; //声明并定义a
extern int a; //extern表示声明但不定义a。
extern int a = 2; //任何包含了显示初始化的声明就成了定义
初始化和赋值
- 初始化:当对象在创建时获得了一个特定值。
- 赋值:擦除原有的值,并赋予新值。
两者的区别其实就是在创建时给值,还是创建后给值。
int a = 2; //初始化
a = 3; //赋值
一个小细节
对于int a = 2;
我们可以很明显地分析这句话是声明并定义了变量a,并将a初始化为2。
但是对于int a;
这句代码,我们该怎么分析呢?
首先这句代码声明并定义了a,但是它到底有没有进行初始化呢?
还记得我之前说定义有可能初始化么,其实这个初始化不仅包括显式初始化,而且包括默认初始化。
但是默认初始化又与变量的类型和变量所在的位置有关:
- 当变量为自定义类类型:调用自身的默认构造函数进行初始化。
- 当变量为内置类型时:
- 该变量定义在函数体外时,将被初始化为0。
- 该变量定义在函数体内时,将不会进行初始化。
所以对于int a;
这行代码是否进行初始化,还跟其所在的位置有关。