




已阅读5页,还剩115页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象程序设计语言C+,电子科技大学计算机学院陈文宇,1,第二章C+语法,2.1C+程序概貌第一个C+程序#include/包含ANSIC+头文件voidmain()cout“Hello,world!”endl;/输出字符串,2,#include/包含ANSIC+库文件voidmain()std:cout“Hello,world!”std:endl;,#include/包含ANSIC+库文件usingnamespacestd;/使用预定义的名字空间stdvoidmain()cout“Hello,world!”endl;,第二章C+语法,2.1C+程序概貌2.1.1ISO/ANSIC+库文件程序的第一行是#include。#include是一条编译预处理指令,它的作用是在源文件中插入iostream文件所包含的所有源代码。iostream文件是标准C+的一个库文件。,5,C语言的头文件都有后缀.h,C+语言可以直接使用这些带.h后缀的头文件。为避免命名的冲突,ISO/ANSIC+标准将每一个C语言的头文件对应地改造为一个库文件(文件名仅仅是将原文件的.h去掉),并将该文件中定义的标识符定义在标准的名字std中。,第二章C+语法,2.1C+程序概貌2.1.2名字空间包含头文件iostream的目的是为了使用标准输出流cout和endl。通过usingnamespacestd语句来引入名为std的名字空间。,7,第二章C+语法,2.1C+程序概貌2.1.2名字空间可以自定义名字空间,语法如下:namespacestd/std是一个名字空间的名字/这里声明了常量、变量、数据类型等等,8,第二章C+语法,2.1C+程序概貌2.1.2名字空间一旦一个标识符,例如ken,被定义在一个名字空间里,那么它就被隐藏在了那个名字空间里。也就是说,ken只能被包含在那个名字空间里的语句直接访问。试图在名字空间之外访问ken会得到一个编译器找不到标识符的错误。,9,第二章C+语法,2.1C+程序概貌2.1.2名字空间解决问题的方案有两个:使用名字限定符std:cout“Hello,world!”和“变量名;“”在C语言中是右移运算符,在C+语言中,如果第一个操作数为cin,它就是输入运算符。输出格式为:变量cout表达式常量(各种类型常量均可)“”在C语言中是左移运算符,在C+语言中,如果第一个操作数为cout,它就是输出运算符。输入和输出运算符可以连用。,第二章C+语法,2.1C+程序概貌2.1.5注释为程序加入适当的注释是非常有价值的,因为这些注释可以为我们阅读程序提供帮助。C+具有C的多行风格注解。使用“/*”开始,直到“*/”结束,可以注解多行,但不允许嵌套。C+也提供一种新的表示注解的方法,Comment_to_end_of_line的结构,使用“/”开始,直到行尾结束。,14,第二章C+语法,2.2C+的内建(Built-in)类型2.2.1整数类型1.整型C+整数类型包括字符型char、短整型short、整型int和长整型long。下面的这些数的类型都属于整数类型:-128,-30,0,64,65535,680712,15,第二章C+语法,2.2C+的内建(Built-in)类型2.2.1整数类型整型可以用到的整数类型有8种:char,short,int,long,unsignedchar,unsignedshort,unsignedint,unsignedlong其中,unsignedint可以简写为unsigned。,16,第二章C+语法,2.2C+的内建(Built-in)类型2.2.1整数类型2.字符型字符型char是一种特别的整数类型。字符型数据在内存中是以ASCII码的形式存储的。由于字符的存储值ASCII码是个整数,因此在某些情况下我们会把字符数据当作整型数据来参与运算。,17,第二章C+语法,2.2C+的内建(Built-in)类型2.2.1整数类型2.字符型C+的转意字符序列。比如,n并不代表字符n,而是表示新行(newline)。这里符号(反斜杆)叫做转意字符,意思是跟在它后面的字符不再是原来的含义,而是具有其它的含义。如果当要用到符号本身,需要把它写成。,18,第二章C+语法,2.2C+的内建(Built-in)类型2.2.1整数类型3.布尔型布尔型bool是一种特殊的内建整数类型,因为它采用与整数相同的存储方式。不过,布尔类型的表达范围非常有限,只能取false和true两个值。这是两个C+的关键字,而且是两个字符常量标识符,并不是字符串。,19,第二章C+语法,2.2C+的内建(Built-in)类型2.2.1整数类型3.布尔型应该注意的是,虽然这里把bool类型归为整数类型,但这并不等于我们可以把它当作整数使用。bool类型主要用来表达一种逻辑真或假的状态,它的含义和用途与整数是完全不同的。,20,第二章C+语法,2.2C+的内建(Built-in)类型2.2.2浮点类型浮点数指的是带有小数部分的数,用来表示数学意义上的实数。实数的表示是:整数部分.小数部分其中小数部分看起来也是个整数。除了小数点,整数部分和小数部分可以缺省,但不能两者都缺。下面是一些浮点数的例子:3.14159,-123.45,0.957,6.,.2,21,第二章C+语法,2.2C+的内建(Built-in)类型2.2.2浮点类型C+的浮点类型有三种:float、double、longdouble。由于所有的计算机都是用二进制的方式来存储数据的,因此这影响了浮点数的表示精度,浮点数的存储值和实际值是有很微小的差别的。如何判断两个浮点型变量的值是否相等?,22,第二章C+语法,2.3变量和命名常量2.3.1标识符为了使C+程序更加易读易写,我们会用一些有意义的名字来标识程序元素,比如数据、函数等等。那些用来标识程序元素的名字就是标识符。使用自定义标识符也是所有高级语言的特征。标识符是由字母A-Z,a-z和数字0-9混合而成的,另外可以加入下划线_。不过,所有的标识符必须以字母或者是下划线_开头。,23,第二章C+语法,2.3变量和命名常量2.3.1标识符命名一个标识符的时候,遵循一些常用的约定:取一个有意义的名字。如果名字由多个单词组成,那么每个单词的第一个字母用大写。(C+是大小写敏感的语言)使用匈牙利记号。匈牙利记号是一种前缀,其做法是在标识符的前面加上一个小写字母以示其数据类型。,24,第二章C+语法,2.3变量和命名常量2.3.2变量声明下面是变量声明的例子:charcData;boolbFlag;intiPage,nCount;doublefDelta;,25,第二章C+语法,2.3变量和命名常量2.3.2变量声明一旦声明了一个变量,这个变量在运行时就会在内存中占据一定大小的空间。例如声明变量iPage在内存中的映像如下图所示:,26,第二章C+语法,2.3变量和命名常量2.3.3常量(NamedConstant)和const关键字常量一些常量(字面常量)和所属类型的例子:10(int)077L(long)0 xABCDu(unsignedint)9.78f(float)7905.30(double)A(char),27,第二章C+语法,2.3变量和命名常量2.3.3常量(NamedConstant)和const关键字命名常量使用字面常量省掉了占用内存单元的开销,但也有一些缺点:在多处使用了相同的字面常量,而后来又要对这个常量进行修改时就会显得非常麻烦;字面常量没有明确的类型信息,它们的类型采用编译器的约定。,28,第二章C+语法,2.3变量和命名常量2.3.3常量(NamedConstant)和const关键字命名常量为了解决上述的问题,可以使用C风格的没有参数的宏定义:#definePI3.14PI并不是真正的符号常量。仅是一个字符串,没有类型,不占用存储空间,不能取它的地址。,29,第二章C+语法,2.3变量和命名常量2.3.3常量(NamedConstant)和const关键字命名常量C+提供灵活的命名常量方式来描述常数:constfloatPI=3.14;PI成为一个真正的符号常量,有类型,需要占用存储空间(存放在常量数据区)。PI的值不能被修改。,30,第二章C+语法,2.3变量和命名常量2.3.4易变变量和volatile关键字在程序中使用某些变量,很容易被改变。这很容易造成程序在某一时刻用到的该变量的值并不是它此刻真正的值。C+引入了“易变变量(VolatileVariable)”的概念。C+使用volatile关键字来约束一个变量,以警告编译器这是一个易变变量:volatileintnSharedData;,31,第二章C+语法,2.4用户自定义类型,32,第二章C+语法,2.4用户自定义类型2.4.1枚举用宏来定义一系列表示状态的常量有明显的缺陷,就是没有类型信息。C+提供了一种更好的解决方案,就是使用枚举类型:enumTrafficLightRED,GREEN,AMBER;标识符RED、GREEN、AMBER被称为枚举常量,它们不是字符串,也不是整型常量。另外,枚举常量是有序的。,33,第二章C+语法,2.4用户自定义类型2.4.2数组一维数组一维数组的定义如下:TYPEarray整型常量;,34,第二章C+语法,2.4用户自定义类型2.4.2数组二维数组在处理像矩阵这样的二维阵列(这正是array这个词汇的原意)时,使用二维数组constintROW=3;constintCOL=5;intarrROWCOL;,35,第二章C+语法,2.4用户自定义类型2.4.2数组一维字符数组一维字符数组往往被用来表示字符串。不过,数组最后一个有效字符的后面必须是个结束标记。这样的字符串被称为ASCIZ字符串。charszName=K,e,n,0;,36,第二章C+语法,2.4用户自定义类型2.4.3结构和联合结构struct数组是相同类型数据的集合。当要把不同类型的数据集合在一起时,会用到结构struct。,37,第二章C+语法,2.4用户自定义类型2.4.3结构和联合结构的例子structEmployeeintnID;/工号charszName30;/姓名charcGender;/性别shortnDOB;/出生年份intnDeptID;/工作部门号;,38,第二章C+语法,2.4用户自定义类型2.4.3结构和联合联合union联合的定义类似于结构的定义;联合和结构的不同之处在于,联合变量的每个成员都共享同样的内存单元。一个联合变量的大小实际上是它占据内存最多的那个成员的大小。,39,第二章C+语法,2.4用户自定义类型2.4.4指针指针是另外一个变量的地址,通过这个地址可以间接地访问到那个变量。intnUnit;int*pi=符号*表明了变量pi是一个指针变量;运算符,第二章C+语法,2.4用户自定义类型2.4.4指针指针和常量修饰符constconst也可以与指针一起使用,它们的组合情况复杂一些,可归结为三种:指向常量的指针常指针指向常量的常指针。,43,指向常量的指针constTYPE*pc;pc指向的单元不能改变,但pc可以改变常指针TYPE*constcp=;cp不能改变,但它指向的单元可以改变指向常量的常指针constTYPE*constcpc=;cpc指向的单元不能改变,cpc不可以改变,第二章C+语法,2.4用户自定义类型2.4.5引用引用就是给一个变量取一个别名。也就是说,引用与它所引用的变量实际上是同一个单元(共享存储单元)。,45,引用主要有以下三个用途:()独立引用;()作为参数传递;()作为返回类型。,表示为TYPE,1独立引用,还可以定义常引用。constint,一般来说,独立引用没有什么实际用途。引用的主要用途是函数形参是引用函数返回引用,2引用作为函数参数,C语言采用传值(callbyvalue)方式进行参数传递。当一个函数需要修改对应的实参的值时,参数应明确声明为指针类型。,voidfun(intnum)num=100;voidmain()intannum=10;fun(annum);cout=赋值运算符:=+=-=*=/=%=|=voidfree(void*p);,65,C+提供了新的运算符new和delete来完成动态存储分配和释放存储空间的工作:new的参数是待分配单元的数目,它自动计算要分配类型的大小,而不给出要分配的存储区的大小(字节数);new自动返回正确的指针类型,不必对返回指针进行类型转换;可以用new将分配的存储空间进行初始化;,运算符new用于内存分配的使用形式为type*p;p=newtype;,其中,type是一个数据类型名;p是指向该数据类型的指针;new从堆的一块空闲内存区中分配一块内存其大小就是type类型的数据长度,该内存地址被存于指针p中。如果分配失败,new返回一个空指针。,type可以是任何类型,包括函数指针,但不允许函数类型。当type为数组类型时,new返回的指针指向数组的第一个元素,当用new创建多维数组时,必须提供所有维的大小。,注意:使用new申请的存储空间是没有名字的,只能通过指针间接访问它们。,运算符delete释放new分配的存储空间,将其交还给堆。它的使用形式一般为deletep;其中,p必须是一个指针,保存着new分配的内存的首地址。,动态分配管理的方法要求delete的操作数必须是一个new返回的指针,对不是由new得到的任何其他地址类型,使用delete将导致严重错误。这种错误是运行时的错误,很难调试,因此使用delete时请务必注意。,回收new分配的数组空间,使用delete进行deletep;表明一个由p指向的数组空间被回收了。,new和delete典型用法,1动态分配和释放单个数据的存储区语法为:type*p;p=newtype;/通过*p方式访问new申请的空间。deletep;,intmain()int*p;p=newint;if(!p)cout“allocationfailuren”;return1;*p=20;deletep;return0;,2用new运算符初始化单个数据的存储区语法为:type*p;p=newtype();deletep;,3动态分配数组的存储空间,(1)一维数组语法为:type*p;p=newtypes;/通过pi的方式访问数组元素。deletep;,(2)n维数组,语法为:type(*p)常量1常量2常量n-1;p=newtypes常量1常量2常量n-1;/通过pi1i2in的方式访问数组元素。deletep;s指定数组中的第一维元素个数,可以是常量或表达式。不能省略。,第二章C+语法,2.5C+运算符2.5.3类型转换运算符隐式转换隐式转换发生在下述的情况下:混合运算:级别低的类型向级别高的类型转换。将表达式的值赋给变量:表达式的值向变量类型的值转换。实参向函数形参传值:实参的值向形参的值进行转换。函数返回值:返回的值向函数返回类型的值进行转换。,79,第二章C+语法,2.5C+运算符2.5.3类型转换运算符显式类型转换显式类型转换有几种风格:C风格:(TYPE)表达式(TYPE)(表达式)C+风格:TYPE(表达式),80,第二章C+语法,2.5C+运算符2.5.3类型转换运算符显式类型转换使用类型安全的显式类型转换运算符floatfnum=5.8;constinticnum=10;intinum=static_cast(fnum);intinum2=const_cast(icnum);,81,第二章C+语法,2.6表达式2.6.1C+表达式C+的表达式是一种能计算出一个值的语法分量,它的形式化定义如下:表达式:=变量名|常量名|字面常量表达式:=(表达式)表达式:=表达式运算符表达式,82,第二章C+语法,2.6表达式2.6.1C+表达式C+的表达式是一种能计算出一个值的语法分量,它的形式化定义如下:表达式:=变量名|常量名|字面常量表达式:=(表达式)表达式:=表达式运算符表达式,83,第二章C+语法,2.7C+语句2.7.1简单语句和复合语句在任何合法的C+表达式后面加上一个分号“;”就能使其构成一条合法的C+语句。甚至一个单独的分号也能成为语句,这叫空语句。任何C+声明都是语句。多条语句可以复合在一起完成一定的功能。这些语句构成了复合语句。复合语句必须放在一对花括号之间。,84,第二章C+语法,2.7C+语句2.7.2流程控制语句if-else语句if(bool表达式)语句1else语句2(ex2-11.cpp),85,第二章C+语法,2.7C+语句2.7.2流程控制语句switch-case语句switch(整型表达式)case常量表达式1:语句1;break;case常量表达式2:语句2;break;default:语句n;(ex2-12.cpp),86,第二章C+语法,2.7C+语句2.7.2流程控制语句while语句while(bool表达式)语句(ex2-13.cpp),87,第二章C+语法,2.7C+语句2.7.2流程控制语句do-while语句do语句while(bool表达式);(ex2-14.cpp),88,第二章C+语法,2.7C+语句2.7.2流程控制语句for语句for(表达式1;表达式2;表达式3)语句(ex2-15.cpp),89,第二章C+语法,2.7C+语句2.7.2流程控制语句break和continue语句在循环控制语句当中,如果我们根据某个条件需要提前结束整个循环,我们可以利用break语句。不过,break语句只能终止包含它的那层循环语句。如果这层循环包含在另一个外层循环之内,那么break就鞭长莫及了。忽略此后的包含在循环体中的语句而直接进入下一次的循环可以使用continue语句。(ex2-16.17.cpp),90,第二章C+语法,2.7C+语句2.7.2流程控制语句goto语句很多的专家都认为应该取消goto语句,不过C+还是保留了它。现在goto语句的最大作用就是从嵌套很深的循环中直接跳出来。在其它的场合尽量少使用goto语句。其实goto语句也可以构成循环,不过在高级语言程序中我们都不这么做,除非有特别的理由。,91,第二章C+语法,2.7C+语句2.7.2流程控制语句return语句return语句会引起函数立刻返回(结束),main函数也不例外。return语句的格式为:return表达式;,92,第二章C+语法,2.7C+语句2.7.2流程控制语句try-catch语句try-catch语句用于保护容易发生错误的语句块,并且能在错误发生时捕获错误,然后对错误进行处理。它的语法如下:Try语句*;catch(类型1变量名1)语句;catch(类型2变量名2)语句;catch(类型n变量名3)语句;,93,第二章C+语法,2.8函数2.8.1函数原型声明和定义函数原型是一个很重要的概念,函数原型担负着三个特殊的任务:确定函数返回值的类型,使编译程序能产生函数返回数据类型的正确代码。确定了函数使用的参数的类型、个数和顺序。函数名代表该函数的函数体以及函数完成的功能。函数原型一般的语法形式为返回类型函数名(参数列表),94,第二章C+语法,2.8函数2.8.2函数的参数C+采用“传值”或“传地址”的方式来使实际参数和形式参数相结合。传值调用(Callbyvalue)实参和形参是两个不同的单元,在结合时,实参的值将会被拷贝到形参中。,95,第二章C+语法,2.8函数2.8.2函数的参数2、传地址引用做参数。形参是实参的别名。也就是说,形参就是实参本身。这样一来,对形参的改变也就直接改变了实参。,96,第二章C+语法,2.8函数2.8.2函数的参数用const修饰参数使用指针和引用参数,实参存在被更改的潜在“危险”。为了避免这种危险,可以给形参加上const约束,这是形参/实参成为只读参数,从而避免了被更改的问题。,97,第二章C+语法,2.8函数2.8.2函数的参数缺省参数缺省参数是另一种形式的重载(函数调用的重载)voidfun(intnum=0)(ex2-21.cpp)其中:num称为缺省参数,0称为缺省值。可以用两种方式调用函数fun:fun(10);/传递显式的值,则num的初始值为10fun();/无对应的实参,则num的初始值为0,98,第二章C+语法,2.8函数2.8.3函数的返回值函数是一个完成一定功能的程序块,在很多时候需要将计算的结果传递给调用该函数的程序块。传递结果的方式之一就是让函数返回一个值。实际上是将返回的值放到一个结果寄存器或临时单元中。,99,第二章C+语法,2.8函数2.8.3函数的返回值1.函数返回值函数返回的值类型,intstrlen(constchar*str)char*p=str;While(*p)p+;returnpstr;,100,第二章C+语法,2.8函数2.8.3函数的返回值2.函数返回指针函数返回指针,实际上也是返回一个值,不过这个值是某个单元的地址。,101,char*strcat(constchar*str1,constchar*str2)char*str=newcharstrlen(str1)+strlen(str2)+1;char*p=str;while(*p+=*str1+);p-;while(*p+=*str2+);returnstr;,第二章C+语法,2.8函数2.8.3函数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国北京商业地产行业市场全景评估及发展战略规划报告
- 2025年中国转速计行业市场运营现状及投资战略咨询报告
- 中国锌污染治理行业市场前景预测及投资战略研究报告
- 2019-2025年中国茶多酚行业市场调研分析及投资战略咨询报告
- 2025年中国红外测温检漏仪行业市场发展前景及发展趋势与投资战略研究报告
- 【可行性报告】2025年锂离子电池相关项目可行性研究报告
- 中国多丽埃特板行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
- 2025年中国铁路养路机械行业市场发展监测及投资方向研究报告
- 目标奋斗课件
- 2025年部编版语文三年级下册-第七单元测试题-含答案
- DB11∕T 243-2014 户外广告设施技术规范
- (完整版)牵伸技术
- 万达入职在线测评题
- 电子音乐行业发展建议
- TGDNAS 043-2024 成人静脉中等长度导管置管技术
- 个人要账委托书格式
- 《陆上风电场工程概算定额》NBT 31010-2019
- 乡村医生艾滋病知识培训
- 设备维保的经验总结与分享
- 2024年天津港集团有限公司招聘笔试参考题库附带答案详解
- 个体诊所药品清单模板
评论
0/150
提交评论