声明和定义
在c++中支持分离式编译所以c++讲声明和定义区分开来,声明是使得名字为程序所知,定义负责创建于名字关联的实体。变量声明规定了变量的类型和名字,在这一点哈桑定义与之相同,此外定义还申请内存空间,也可能会为变量赋初值。
一条声明语句由一个基本数据类型和紧随其后的一个声明符列表组成。每个声明符命名了一个变量并指定该变量是与基本数据类型有关的某种类型。
简单的如
int a;
声明符其实就是变量名,此时变量类型就是声明的基本数据类型 int。
在复合类型的声明定义中 如
int *p;
int是基本数据类型,*p是声明符,此声明符命名了一个变量p并指出这个变量p是与基本数据类型int有关的某种类型,这种关系是 p是整型指针。
int a;
int &r=i;
&r是声明符,命名了变量r,变量r与基本数据类型int有关,关系是 r是整型引用。
再来看指针和const
指针常量(const pointer)和指向常量的指针(pointer to const)(我觉得记英文更有助于理解)这两个是经常容易混淆的概念
int *const pt1;//指针常量(const pointer)
int const *pt2;//指向常量的指针(pointer to const
pt1是指针常量,不能改变其所指向的对象的内容,其本身的内容可以改变。pt2是常量指针,指针本身的值不能改变,但其所指对象的内容可以改变。
再从复合类型的声明角度来看,从右向左读第一句声明语句。离pt1最近的是const pt1先被限定为常量,声明符*说明这个常量是一个基本数据类型int的指针,这样就能理解pt1是一个常量指针,它本身是一个常量,它是一个指向整型的指针。
pt2是指向常量的指针。从右向左离pt2最近的是* 是声明符的一部分,*说明pt2是指向基本数据类型的指针,再往前看 这个基本数据类型int 被const限定为常量,所以pt2是一个指针,指向了一个整型常量。
关于指针和const再加一点。 指向常量的指针不一定要指向一个常量,而一个常量必须要用一个相应类型的指针来指。当一个常量指针指向一个非常量时,可以理解为它以为自己指向了一个常量,并且按照对常量的操作规则来约束自己。
int a;
int const *p=&a;
a=5;
*p=5;//error l-value specifies const object 虽然a本身并不是常量 但不能通过指向常量的指针p来对其赋值。