C++中声明和定义的区别

声明 
这有一个与这个名字相关的东西,并且它是这个类型的,告诉编译器我要使用它,并期待它定义在某一个地方。 
定义 
定义是指提供所有必要的信息(占用内存大小),使其能够创建整个实体。 
我们必须明白的: 
一旦定义了也就是声明了,所以可以同时声明和定义一个函数、 类或者变量,但是不一定非得这样做。 

定义一个函数意味着提供函数体; 
void func() {}; 
定义一个类意味着给出类的方法以及成员; 
class A {}; 
定义一个变量意味着告诉编译器变量的类型以及在程序的哪儿去创建这个变量; 
int a; 
默认声明一个变量,必须提供定义! 

如何仅仅只去声明一个变量?请用extern!  
extern int a; 仅仅只是声明变量而不去创建它 
当extern修饰变量初始化式时,失去extern仅仅声明的效果,表示定义。 
extern int a = 3;  
当extern修饰函数定义以及类定义时,同时也失去了extern仅仅声明的效果。 

说道extern,我们来说一下C++中的storage classes 
storage classes定义了C++程序中的变量、函数的作用域以及生命周期。 
auto 
所有局部变量的默认的storage classes 
register 
用于局部变量,声明该变量存储于寄存器中,对该变量不能用&取地址运算 
extern 
用于全局变量或者函数,声明该变量或者函数是全局可见的,告诉编译器该变量或者函数可以在程序的某个地方找到 
static 

用于全局变量或者函数,声明该变量或者函数是本编译单元可见(.o文件),不同的.o文件包含了名字相同的staic变量或者函数,会有不同的副本,编译不会出错;C++中,static还用于类中的数据成员和成员函数 

局部变量默认是auto
非const全局变量默认是extern,const全局变量默认是static
所有变量默认声明就是定义
函数默认是extern 

分析举例
int a; //声明即是定义
a是int类型的(声明);int类型占用4个字节(定义);
extern int a; //声明
a仅仅只是int类型的(声明)

class A {int a;}; //声明即是定义
A是一个class类型的(声明);class A中有一个int成员a,占用4字节(定义);
class A; //声明
A是一个class类型的(声明);class类型不知道占用多少个字节,class是本地属性,只作用于本编译单元(.o文件),同一个编译单元(.o文件)不能有相同名字的class;不同的编译单元(.o文件)可存在不同的class,不会出现链接错误

A obj_a;    //声明即是定义
obj_a是一个class A类型(声明);class A类型占用4个字节
extern A obj_a;    //声明
obj_a仅仅只是class A类型; 

 

posted on 2015-11-20 17:14  zyz913614263  阅读(234)  评论(0编辑  收藏  举报

导航