C++声明、定义、变量、数据类型专题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文作者:黄邦勇帅
本文是学习C++最基础的内容,因此应对其熟练掌握,本文主要介绍了声明与定义的区别,C++中有关变量及数据类型的描述,其中由浅入深的介绍了复杂声明的分析方法,本文内容由浅入深,内容较为全面。
本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正。
声明:禁止抄袭本文,若需要转载本文请注明转载的网址,或者注明转载自“黄邦勇帅”。
主要参考文献:
1、C++.Primer.Plus.第五版.中文版[美]Stephen Prata著孙建春韦强译人民邮电出版社2005年5月
2、C++.Primer.Plus.第四版.中文版Stanley B.Lippman、Barbara E.Moo著李师贤等译人民邮电出版社2006年3月
3、C语言:标准与实现volume 1 作者不详,前言是“姚新颜”写的可能就是作者,出版社不详,2004年8月
4、《程序设计语言C》中华人民共和国国家标准GB/T 15272-94 1994年12月7日发布出版社不详
5、《C++程序设计原理与实践》[美]Bjarne Stroustrup著王刚刘晓光吴英李涛译机械工业出版社2010年6月
6、《C++程序设计语言》特别版[美]Bjarne Stroustrup著裘宗燕译机械工业出版社2010年3月
7、《C和指针》第二版[美] Kenneth A.Reek著徐波译人民邮电出版社出版日期不详
8、《C陷阱与缺陷》Andrew Koenig 著高巍译王昕审校人民邮电出版社出版日期不详
9、《C专家编程》作者、出版社、出版日期不详
10、《C语言核心技术》Peter Prinz εTony Crawford著O’Reilly Taiwan公司译机械工业出版社2007年8月
11、《ANSI C标准详解》作者、出版社、出版日期不详
第3部分声明、定义、变量、数据类型专题
关键概念
1、对象:指的是某种类型所占据的一片连续的内存单元,注意:对象不仅仅指的是一片连续的内存单元,而且这片内
存区域已经指定了某种类型。
2、标识符:标识符就是一个名字,使用标识符主要是与C++中的关键字相区别,本文所讲的名字和标识符都是指的标
识符。
一、变量、类型简单理解请参考《C++整型、字符型、浮点型专题》相关内容。
二、变量、对象、实体深度理解
1、注意:本文中的对象与类的对象是两个概念,应区别对待。
2、对象:指的是某种类型所占据的一片连续的内存单元,注意:对象不仅仅指的是一片连续的内存单元,而且这片内
存区域已经指定了某种类型。
3、变量:变量其实就是命名后的对象,也就是说变量是为指定类型的连续的内存单元(即对象)取的一个名字。一块连
续的内存单元,若我们使用内存的地址编号来访问这块内存单元,这样会让程序很难让人理解,因此就有必要为一块保存特定类型的连续的内存单元(即对象)取一个名字,这个名字就是我们所说的变量。
4、实体:本文中所说的实体就是变量的另一个名字,一般情况下变量指的是像整型,浮点型这些类型的对象,按变量
的概念,变量还可以是函数名,指针名,数组名等,为了描述方便,有时会使用实体一词。
5、从以上概念可以看出,变量、对象和实体三者的没有什么本质的区别。
三、类型深度理解
1、类型与内存
内存中的比特值的含义完全决定于这块内存单元所表示的类型,保存在计算机中的值是一些二进制比特,这些二进制比特对于计算机来讲,它并不知道代表什么意义,只有当我们决定如何解释这些比特时才有意义,比如65或字符’a’在内存中的比特值是相同的,若将比特值解释为int型,则他是一个十进制数,若解释为char型,则是这符a,因此在内存单元中的数据应具有一个类型,当类型确定后就能对其中的数据作出正确的解释了。
2、类型的作用
1)、类型决定了可以将什么数据赋给对象(比如整数3可以赋给int型,”dd”可以赋给string型等)
2)、类型决定了可以对该对象进行什么样的操作(比如可以对int型的变量或常量进行加、减、乘、除等操作,不能
进字符串变量或常量进行加、减、乘、除等操作)。
3)、类型还决定了对象的内存大小、布局和取值范围
3、每个名字(或变量,变量就是命名后的对象,因此一个变量就是一个名字)、表达式都应有一个类型,这个类型决定
了可以对这个名字进行什么样的操作,因此类型决定了这个名字或表达式的使用方式。
4、不能对变量赋予一个类型错误的值。
5、编译器会记录每个变量的类型,并确认对它进行的操作是否与类型相一致。
四、声明与定义
1、声明是一条语句,声明为对象起了一个名字,同时为名字确定了一个类型。
2、声明的作用:
1)、C++使用声明语句来告诉编译器一个对象的名字,比如int x;表示x是一块类型为int的内存区域的名字。
2)、C++使用声明语句告诉编译器一个对象是什么类型。比如语句int x;就能告诉编译器变量x的类型为int型。一个命名的对象必须有一个类型,有了具体的类型我们才能确定对对象作出什么样的操作,对象能够接收什么样的值等,C++使用声明语句来实现此目的。
3、定义:定义是一个声明,同时定义会为对象分配内存空间,因此定义也是一个声明。
五、声明与定义的区别及注意事项
1、C++中的名字(标识符)必须先声明后再使用,也就是说在使用前必须先确定它的类型,以通知编译器这个名字所引
用的是什么类型的实体。
2、对同一个名字只能定义一次,因为定义为命名对象(比如变量,函数名等)分配了内存,同一名字的对象只能分配一
个内存位置,所以只能定义一次。
3、对同一个名字的声明可以有任意多次。
4、对同一个名字的所有声明必须具有相同的类型。
5、区别声明与定义的方法:就是在程序中对同一个标识符声明多次,若语句不出错,则是声明,若出错,则是定义,
比如extern int a; extern int a;程序不会出错,因此是声明,而int a; int a;则会出错,因此是定义。注:变量的声明与定义详见后文。
5、任何进行了初始化操作的语句都是定义。
6、每个定义都是一个声明,但声明未必是定义。
7、非定义的声明仅仅告诉编译器程序中有这么一个具有指定类型的名字,因此声明不会为对象分配内存(比如为变量
分配内存,为函数指定函数体)。
8、对于变量来说,其声明只说明了类型,而定义则会为该变量分配存储空间。
9、对于函数来说,声明也提供了类型(即参数类型和反回类型),而定义才会提供函数体(即{}括起来的部分)。
10、注意:函数体是被作为程序的一部分而被保存在内存中的,因此函数和变量的定义都消耗了内存,而声明则没有。
11、注意:在声明时,在名字后带一对空的小括号程序会认为这是一个函数,而不是对类调用的默认构造函数(详见后
文),比如hy g(); 其中hy是一个类类型(即class hy{...}),语句hy g();只是表明是对一个函数的声明,而不会是使用默认构造函数创建一个类类型的对象g。
六、声明的语法形式
声明的形式为:[ [存储类区分符] | [类型限定词] ] <类型区分符> 声明符[, 声明符[, 声明符[, ....]];
说明:
1、方括号”[]”中的内容表示可选项,以短竖线”|”隔开的内容可以只选一项,尖括号<>中的内容是必选项。
2、存储类区分符有:extern , static, auto, register。其中extern表示外部的,static表示静态的,auto表示自动,register
表示寄存器,存储类区分符请参看语句与作用域部分内容,本文不深入讨论。
3、类型限定词有2个:const, volatile。其中const一般被理解为只读,而volatile则是易变。
4、类型区分符有:基本类型(如int, float, double, unsigned long int等);void类型;枚举、结构或联合类型;用户自定义
类型;
5、声明符:
1)、声明符可以有多个,多个声明符之间使用逗号相隔开。
2)、有5种不同的声明符,即标识符,函数声明符(),数组声明符[],指针声明符*,引用声明符&;根据声明符的
不同,我们可以声明不同的对象。
3)、若声明符就是一个标识符,则标识符会被声明为一个变量。
4)、函数声明符():若标识符后跟一对圆括号的情形,圆括号内可能有形参表,则这时标识符将被声明为一个函数,
比如int f(float);就表示标识符f是一个反回类型为int带有一个float形参的函数。
5)、数组声明符[]:若标识符后跟一对方括号,方括号内是任选的常量表达式,则这时标识符将被声明为一个数组,
比如int a[11]; 表示标识符a是一个int型数组。
6)、指针声明符*:若在标识符的前面有一个星号”*”,在星号和标识符之间可能会有类型限定词,则这时标识符将
被声明为一个指针,比如int *p; 表示标识符p是一个int型指针;再如int *const p; float *p; 等。
7)、引用声明符&:若在标识符的前面有一个符号”&”,则这个标识符将被声明为一个引用,比如int &b;表示标识
符b被声明一个类型为int的引用。
七、声明的规则和限制