声明,是用以告诉编译器类型及其细节,本身并不涉及内存分配;
定义,即内存分配,编译器将在相对内存地址上为其对象定址。
定义的同时也作了声明,当定义的时候我们肯定已经告知编译器其类型及细节,然后才能分配内存。总体来说,它们的根本区别就是有无内存的分配,下面具体分析:
int x; //定义x,已为x分配内存,但值未知
int x=1; //定义x,已为x分配内存,值初始化为1
extern int x; //使用关键字extern声明x,告知编译器x类型及其它细节,但未分配内存。
//其定义可以在本.cpp中定义,也可以在其它.cpp中定义,
//原因是由于extern关键字,更多细节参见extern解析
另外,extern int x=1
也被当做定义,虽然用了extern
来修饰,注意此句若放在函数内部,包括main()
,会报错:不允许对外部变量的局部声明使用初始值设定项。因为这是毫无意义的,读者可以参考stackoverflow的一篇帖子。
如果是类成员变量呢?
class Tree
{
private:
double height; //普通成员变量,这是声明
static int num; //静态成员变量,这是声明
public:
Tree();
};
int Tree::num; //这是定义
定义时分配内存,static
定义的变量放在全局/静态存储区。只要程序正确运行,不管我们有没有使用类Tree
定义对象,静态成员变量num
都已经在内存中存在,而普通变量height
只有在定义类对象时才会出现。读者可以调试并监视即可得到证实。