C++声明、定义、复杂声明及typedef专题(5)
时间:2026-01-20
时间:2026-01-20
本文对C++的复杂声明,作了深入地道的讲解,对使用typedef化简复杂声时和还原复杂声明也作了深入详细的讲解。
4、编译器可将非volatile类型的const对象放在只读存储区,若从不使用它,则编译器有可能不会为该变量分配内存。
5、若变量同时使用const和volatile限定,则此变量无法被程序本身所修改,但可以被其他程序或硬件修改。
6、使用const声明常变量时,const关键字与类型区分符的顺序无关紧要,比如int const a=1;与const int a=1;是等价的。
7、使用const声明的变量必须进行初始化,因为使用const后是一个常量,其值无法在以后使用赋值运算符进行修改,因此在声明时必须进行初始化。
8、注意:若const的左右都没有类型区分符,且左边也没有*指针运算符时,这种声明是错误的,比如int (const p)=0;是错误的,再如int (const p[3]); int *(const p)=0; int *(const p[3])={0};等都是错误的
9、volatile限定词很少被使用,因此不重点介绍。
示例:声明的规则和限制、变量的声明和定义、复杂声明
#include<iostream>
usingnamespacestd;
//a1=2;
inta2;
//int a2;
externinta3;
externinta3;
//extern long int a3;
externinta5=2;
//extern auto int a6;
//const a7; //错误,标识符必须先声明后使用。//未使用extern的变量声明同时是一个定义,因此此语句会为变量分配内存空间。//错误,同一变量只能定义一次。//这是对变量的非定义声明,使用extern关键定,而且未初始化。//正确,可以对同一个标识符声明多次。//错误,对同一标识符的多次声明必须要有相同的类型。//任何进行了初始化的语句都是一个定义。//错误,在声明时只能指定一个存储类区分符,即auto, extern ,static, register之中的一个。//错误,C++中必须为标识符指定类型区分符(比如int, float等),这种语句在C语言中是正常的,
因为C支持默认的int型。
constconstvolatileinta8=8; //正确,声明中可以使用多个相同或不同的类型限定词,对于多于的相同类型限定词编译器会忽略。
若变量同时使用const和volatile限定,则此变量无法被程序本身所修改,但可以被其他程序或硬
件修改。注意:const常量必须初始化。
//int a9 auto; //错误,存储类区分符应在标识符的前面。
//int a10 const; //错误,类型限定词应出现在标识符的前面,但在类中声明的成员函数时除外。
classA{voidf1() const;}; //在类中声明的成员函数可以将类型限定词放在函数名的后面,注意:只有函数才是正确的,对于
变量将会出错。
//int []a11; //错误,()、[]运算符,在声明时必须放在标识符的后面,这种语句在java中是允许的。
//int a12*; //错误,声明时*、&、*const必须放在标识符的前面。
//int *static a13; //错误,*不能放在类型区分符(如int, float等)和存储类区分符(如auto, extern等)的前面int*consta14=0; //正确,*可以放在类型限定词的前面,这时类型限定词限定的是左边的*(即指针),
//int f2()(); //错误,函数不能反回函数。
int(*f3())(); //正确,函数的反回值可以是一个指向函数的指针,函数f3反回一个指针,这个指针指向一个函数。//int f4()[]; //错误,函数的反回值不能是一个数组。
int(*f5())[]; //正确,函数的反回值可以是一个指向数组的指针。
//int a15[](); //错误,数组中的元素不能是函数。
int(*a16[])(); //正确,数组中的元素可以是一个指向函数的指针。
inta17[3][11]; //正确,数组中的元素可以是一个数组,这就是普通的二维数组
inta18=18; //变量的复制初始化语法之一。
inta19={19}; //使用大括号{}对变量进行复制初始化,此方法一般用于声明有多个元素的数组,
inta20[]={1,2,}; //使用大括号{}一般用于初始化有多个元素的数组,每个值之间使用逗号隔开,且以逗号结束,当
然也可以省略最后的那个逗号。
inta21(21); //变量的直接初始化方法,就是在变量名后紧跟小括号并在其中指定初始值。
inta22(); //注意:直接初始化时,变量名后的括号不能为空值,若为空值则表示的是声明一个反回指定类
型的无参函数,因此这里表示的是声明一个反回int类型的无参函数,这里不是在使用直接初始
化方式初始化变量。
inta23; //在函数体外定义的变量会被自动初始化为值0;
voidmain()
{intb1,b2,b3=33,b4,b5=3; //同时声明或初始化多个变量时使用逗号隔开
//extern int a24=3; //错误,在函数内部不能对使用extern声明的变量进行初始化。
externinta23; //extern表明此变量在程序中的其他地方有定义或者在其他文件中有定义,这里a23在函数体外被定义。inta25;// 在函数体内定义的内置类型变量不会对其进行初始化,编译器一般都会为变量产生一个随机值。//复制初始化与赋值区别:初始化是在创建变量的时候给他一个初始值,而赋值则是发生在变量已经创建之后进行的擦除旧值写入新值的操作。
inta26=26; //这是复制初始化,这是在创建变量a26时(这时变量a26还没有值)就将变量a26的值初始化为了
a26=261; //这是赋值,表示将变量a26的旧值擦除,并将新值写入到变量a26中。
//a8=8; //错误,不能对常量a8的值进行修改。
//int *(const p)=0; //错误,const的左右必须有类型 …… 此处隐藏:633字,全部文档内容请下载后查看。喜欢就下载吧 ……