C++声明、定义、复杂声明及typedef专题(4)
时间:2026-01-20
时间:2026-01-20
本文对C++的复杂声明,作了深入地道的讲解,对使用typedef化简复杂声时和还原复杂声明也作了深入详细的讲解。
先级更高。
8、注意:*可以放在类型限定词const和volatile的前面,但不能放在类型区分符(如int, float等)和存储类区分符(如auto, extern等)的前面。
9、函数的反回值不能是一个函数,但反回值可以是一个函数指针,比如int f()();是非法的,int (*f())()是正确的。
10、函数的反回值不能是一个数组,但反回值可以是一个指向数组的指针,比如int f()[]是错误的,int (*f())[];是正确的。
11、数组里面的元素不能有函数,但数组里面可以有函数指针,即int f[]()是不正确的,int (*f[])();是正确的。
12、在数组里面可以有其他数组,即我们经常见到的二维数组int f[][];是正确的。
13、使用声明语法可以产生很复杂的声明,比如int *const volatile *(*f)();等,复杂声明的类型的判断方法,本文后面会
做详细介绍。
14、关于指针,函数,数组的内容将在相应章节详细介绍,在理解声明时不必知道函数,指数,数组是什么,我们只
需知道他们的形式即可,即在标识符后有方括号是数组,比如a[],在标识符后有圆括号是函数,比如f(),在标识符前有星号是指针,比如*p等。
八、变量的声明、定义及初始化、赋值
1、注意:此节所讲的变量不包括函数,指数,数组,关于函数、指针、数组的声明与定义详见相关章节。
2、对于变量来说未使用extern关键字的声明是一个定义,因此会为变量分配内存空间,
3、初始化:是指在定义变量时给出变量的初始值,比如int a=1;表示将变量a的值初始化为1,这时变量a拥有值1。
4、两种初始化变量的形式:即复制初始化和直接初始化。使用这两种初始化方法的原因是C++在创建类的对象时会有这两种初始化方法,而且他们是有一定差别的,但对于内置类型变量来讲不会有什么差别。
5、复制初始化:就是在定义时使用赋值运算符(即”=”)进行的初始化,比如int a=1; float b=2.0;就是复制初始化。
6、复制初始化有两种形式:第一种使用表达式,比如int a=1; int b=2+3;等,第二种使用初始化列表(即使用大括号)的形式,初始化列表就是将各个表达式放在大括号中,表达式之间使用逗号隔开,这种形式一般用于初始化数组;示例int a={1}; int b={2+3}; int c[2]={1,2+3};有关数组的初始化请参看数组相关部分内容。
7、注意:使用初始化列表初始化时,大括号中的表达式在C++标准中是以逗号结尾的,当然也可省略,因此int c[]={1,3,};是正确的初始化语法。
8、直接初始化:是指在定义时将值放在变量名后的一对小括号中,比如int a(1); 将把变量a的值初始化为1,
9、注意:在直接初始化时,变量名后的括号不能为空值,若为空值则表示的是声明一个反回指定类型的无参函数,比
如int a(); 表示声明的是一个反回int型的没有形参的函数,而不是在定义一个变量a。
10、复制初始化与赋值的区别:复制初始化使用赋值运算符”=”对变量进行初始化,会让人以为初始化时就是在赋值,
其实初始化与赋值是有区别的,它们的区别在于,初始化是在创建变量的时候给他一个初始值,而赋值则是发生在变量已经创建之后进行的擦除旧值写入新值的操作。比如int a; a=2; 就是赋值,语句int a;定义了一个变量,并为变量分配了存储空间,这时变量已经拥有一个值,若为局部变量(有关局部变量见相关内容)则这个值是随机的,然后a=2; 将变量a的随机值擦除,并将新值2写入到变量a中;而int a=2; 则是在创建变量a时(这时变量a还没有值)就将变量a的值初始化为2了。
11、若是在函数体外定义的或使用static定义的内置类型变量都会自动初始化为0,若是在函数体内定义的内置类型变
量则不会对其进行初始化,这时变量虽没有初始化,但不代表变量就没有值,编译器一般都会为变量产生一个随机值,若在程序中使用了这种变量将会导致一个难以发现的错误,因此建义对内类型变量最好都要初始化,然后再使用。
12、变量的非定义声明:若使用extern来声明变量,同时没有初始化变量,则是对变量的一个非定义的声明,extern
表明此变量在程序中的其他地方有定义或者在其他文件中有定义;比如extern int i; 表示声明一个变量名为i类型为int的变量,此变量在其他地方有定义。
13、非定义声明变量的条件:1、使用extern关键字;2、变量没有初始化。比如extern int x;表示声明一个变量x,而
int y;因为没有使用extern关键字,因此语句不是一个非定义的声明,同理extern int z=1; 这里对变量进行了初始化,因此同样不是一个非定义的声明。
14、注意:使用extern关键字声明变量时不能在函数内对其进行初始化,比如void f(){extern int a=1;}将会得到一个错
误。
15、非定义声明变量与定义的区别:使用extern对变量进行的是一个非定义的声明,因为变量没有定义,因此可以对
变量进行多次声明,而定义,则只能进行一次。
16、声明(或定义)和初始化多个变量:要声明多个变量只需要在每个变量名之间使用逗号隔开即可,比如int a,b,c; 再
如extern int a,b,c;要对声明的多个变量进行初始化,只需在要初始化的变 …… 此处隐藏:639字,全部文档内容请下载后查看。喜欢就下载吧 ……