《OOP(C++)_第3章_C++中的C(最终版).ppt》由会员分享,可在线阅读,更多相关《OOP(C++)_第3章_C++中的C(最终版).ppt(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、OOP(C+)_第第3章章_C+中的中的C(最终版最终版)23.1 C+的词法及词法规则的词法及词法规则33.1 C+3.1 C+的词法及词法规则的词法及词法规则1.1.标识符标识符: 由字母和数字组成,首字符必须是字母(“_”也看作字母)的函数名字、类名、变量名、常量名、对象名、标号名、类型名等。 合法的标识符:hello97, a_dog, _uname,CLASS, 非法的标识符:97hello, a#123, class 2.2.关键字关键字: 系统已预定义的单词,属于保留字,用户不可再重新定义。 asm auto break case catch char class const c
2、ontinue default delete do double else enum extern float for friend goto if inline int long new operator private protected public register return short signed sizeof static struct switch template this throw try typedef union unsigned virtual void volatile while bool true false43.1 C+的词法及词法规则的词法及词法规则(
3、cont.)3.运算符运算符: 系统预定义的函数名字 eg: +,-,*,/,sizeof 作用域分辨符: : eg class_name:member 全局作用域分辨符: : eg :name 堆分配/回收运算符:new , delete eg int * pint; pint=new int(10) int * parr; parr=new int10; delete pint; delete parr; 成员节:.* object.*pointer_to_member 成员节: -* pointer-*pointer_to_member53.1 C+的词法及词法规则的词法及词法规则(co
4、nt.)4.分隔符(标点符号)分隔符(标点符号) 空格:单词与单词之间 int i; 逗号:如说明多个变量,函数的多个参数分隔 int i,j,k; 分号:语句之间,如for循环中, for(int i;i10;i+) 冒号:语句标号与语句之间的分隔符 括号: () 大括号: 5. 常量常量: 在程序中直接使用符号表示的数据。 如:3.1415, “hello world!”6. 注释符注释符 /* */ /* This program writes two messages to the screen*/ / / This is also a comment.63.2 数据类型简介数据类型简
5、介 数据类型定义使用存储空间(内存)的方式。通过定义数据类型,告诉编译器怎样创建一片特定的存储空间,以及怎样操纵这片存储空间。 int i, j, k ; / 内定义类型 struct student stu40; / 结构体 Cstudent cstu10; / 类73.2.1 基本内部基本内部类型类型l char/ int/ float/ double/ voidint main() /* Definition without initialization: */ char protein; int carbohydrates; float fiber; double fat; /* Si
6、multaneous definition & initialization: */ char pizza = A, pop = Z; int dongdings = 100, twinkles = 150, heehos = 200; float chocolate = 3.14159; / Exponential notation: double fudge_ripple = 6e-4; /:83.2.1 基本数据类型基本数据类型-修饰符修饰符修饰符修饰符 signed unsigned long short const volatile(见下页)(见下页)93.2.1 基本数据类型基本数
7、据类型-修饰符修饰符(续续)l volatile:告诉编译程序,该变量值可能按程序中没告诉编译程序,该变量值可能按程序中没有显示说明的方式改变,防止编译器作不正确的优化。有显示说明的方式改变,防止编译器作不正确的优化。 eg: 用户程序中定义的用户程序中定义的GlobalVar被被OS的时钟子程的时钟子程序用来存放时间。序用来存放时间。 volatile int GlobalVar; int i,k; k=GlobalVar; for(i=1;i10000;i+) couti; k=GlobalVar;(尽管在用户程序中未显式修改其值,但(尽管在用户程序中未显式修改其值,但GlobalVar
8、的值仍可能变化。)的值仍可能变化。)103.2.1 基本数据类型基本数据类型-字长字长 字长字长#includevoid main()cout sizeof(char) endl;cout sizeof(int) endl;cout sizeof(float) endl;cout sizeof(double) endl;cout sizeof(long double) endl;输出输出:(硬件相关硬件相关)1 (1)2 (4)4 (4)8 (8)10 (8)注:注: C C的规范的规范(C+(C+继承继承) )并不说明每一个内部类型必须并不说明每一个内部类型必须有多少位,而是规定内部类型必须
9、能存储的最大值和最有多少位,而是规定内部类型必须能存储的最大值和最小值。因此,内部类型的字长跟硬件相关。小值。因此,内部类型的字长跟硬件相关。113.2.1 基本数据类型基本数据类型-bool类型类型C中:非中:非0值表示值表示“真真”,0表示表示“假假”C+: 内部常量内部常量true表示表示“真真”,false表示表示“假假” bool tag; tag = true ; if () tag = false ; if(tag) cout“TRUE”; else cout “FALSE” ;123.2.2 构造类型构造类型-数组数组 数组:数组:数目固定、类型相同的若干个变量的有序 集合;在
10、内存中顺序存储。- 定义:定义: N1 N2Nk ; int a3; / 一维数组一维数组char b35; / 二维数组二维数组 float c357; / 三维数组三维数组 思考:思考: a+1 vs b+1 vs c+1? c234 相对与数组起始地址的偏移?相对与数组起始地址的偏移? 13 3.2.2 构造类型构造类型-数组数组(续续) String:字符串数组字符串数组 char s5 = “abcd”; char s34 = “abc”, “ mnp”, “ xyz”; char s 4 = “12”, “ er”, “ a”; 对对/错错? char s4 = “12”,”er”
11、,”a”;.对对/错错? (char s4 = 错误定义)问:跟普通数组的区别?问:跟普通数组的区别?答:字符串数组可以整体参与运算。答:字符串数组可以整体参与运算。143.2.3 构造类型:指针构造类型:指针51000H1000H地址值地址值apl 指针:是一种特殊的指针:是一种特殊的变量,具有一般变量的三个具有一般变量的三个 基本要素:基本要素:名字、类型、值;l 指针的指针的类型是它所指向变量的类型;是它所指向变量的类型;l 指针的指针的值是该指针是该指针“指向指向”的变量的地址。的变量的地址。int a=5; / a的值是的值是5,类型是,类型是 int ,存储在,存储在 DS:100
12、0H中中 int *p = &a; / p的值是的值是DS:1000H, p的类型是的类型是 int ,存储在存储在 15想一想:想一想:问:下列语句问:下列语句 int a=5; int *p; *p=a; 错在哪里?错在哪里?答:答:p没有被初始化,容易造成内存误用没有被初始化,容易造成内存误用16例:例:int *pi; / int型指针型指针char *pi; / char 型指针型指针char (*pi)3 / 指向数组的指针指向数组的指针int (*pi)( ); / 函数指针函数指针int * test(); / 指针函数指针函数int *pi; / 指向指针的指针指向指针的指针
13、int *pi3; / 指针数组指针数组17例:命令行参数例:命令行参数c: telnet 192.168.2.1 23int main(int argc, char * argv) if (argc=1) cout“命令语法不正确命令语法不正确”; exit(0); if (argc=2) connect(argv1, 23 ); else connect(argv1, atoi(argv2); 183.2.3.3 指针与数组的等价性指针与数组的等价性char buf ;char *pbuf;pbuf-&buf0pbuf + 1-&buf1*pbuf-buf0*(pbuf + 1)-buf1
14、*(pbuf + index)-bufindex/ &buf0 与与pbuf 具有相同的意义。具有相同的意义。/ 数组名不能运算:数组名不能运算: +buf 是错误的。是错误的。19例例1:#include void main( )static int a5 = 5,4,3,2,4;int i,j;i = a2 + a4;j = *(a+2) + *(a+4)cout i “n” j ;输出:输出:7 720例例2:#include void main( )static int b 3 = 1,2,3,4,5,6;b02 = 7;b12 = 8;cout *b “t”*(b+1) “t”*(*
15、(b+1)+2) “n”;cout b02 + b12 + b22;输出:输出: 1 4 8 15213.2.4 引用引用(Reference)&指针是通过地址间接访问某个变量,而引用是通指针是通过地址间接访问某个变量,而引用是通过过别名别名直接访问某个变量,对引用的操作就是对直接访问某个变量,对引用的操作就是对被引用的变量的操作。被引用的变量的操作。 int a=10; int &b=a; / b是是a的别名;的别名; b=b+10; / 对对b的改变,实际上改变的是的改变,实际上改变的是a; cout size; int * parrayInt = new intsize; /动态申请动态
16、申请 char * string = new char20; ; /使用使用parrayInt /释放空间释放空间, 表示撤销整个数组,表示撤销整个数组, delete parrayInt; delete string;293.3.4 New/delete VS malloc/free 编译时,编译时,NewNew可以根据对象的类型,自动决定对象的可以根据对象的类型,自动决定对象的 大小;而大小;而mallocmalloc需要显式指定需要分配空间的大小。需要显式指定需要分配空间的大小。 NewNew返回指向正确类型的指针,不必进行强制类型转返回指向正确类型的指针,不必进行强制类型转 换;而换;
17、而mallocmalloc返回返回void void * *,必须进行强制类型转换,必须进行强制类型转换, 可能带来错误。可能带来错误。struct test int a; char b; test(int ia=0,char ib= );test:test(int ia=0,int ib= ); a=ia; b=ib;C:Main() test * objt = (test *) malloc(sizeof(struct test); objt-test(86,A); ; free(objt); C+:Main() test * objt = new test(86,A); ; delete
18、 objt; 303.3.4 New/delete VS malloc/free(续续) 用用new生成对象时生成对象时,会调用构造函数会调用构造函数, 用用malloc则不则不 会会;同样同样,用用delete删除对象时删除对象时,会调用析构函数会调用析构函数, 用用 free则不会则不会.Time * pint = new Time; / 正确地构造正确地构造delete pint; / 正确地析构正确地析构Time * pint = new Time; / 正确地构造正确地构造free(pint) ; / 可以释放可以释放pint,但不调用析构函数但不调用析构函数,未能完未能完 / 整释
19、放空间整释放空间. Time *pint = (Time *) malloc(sizeof(Time); / 仅分配空间仅分配空间, 未调用构造函数未调用构造函数delete pint; / 正确地析构正确地析构面向对象程序设计 中国科技大学计算机系 马建辉31 如果用如果用freefree释放释放“newnew创建的动态对象创建的动态对象”,那么该对,那么该对象因无法执行析构函数而可能导致程序出错。如果用象因无法执行析构函数而可能导致程序出错。如果用deletedelete释放释放“mallocmalloc申请的动态内存申请的动态内存”,理论上讲程序不,理论上讲程序不会出错,但是该程序的可读
20、性很差。会出错,但是该程序的可读性很差。 因此,因此,new/deletenew/delete必须配对使用,必须配对使用,malloc/freemalloc/free也一也一样。样。323.4 表达式表达式所有表达式都有值!333.4.1 优先级和结合性优先级和结合性空格空格 i+ +i 或或 i+(+i) 等价于等价于 (i+)+(+i) -101 等价于等价于 (-10) 1343.4.2 副作用(结果依赖编译器)副作用(结果依赖编译器) int V10, i = 1; vi = i +; 可能等价于:可能等价于:v1=1; 或:或:v2=1;353.5 语句语句363.5.1 C+的语句
21、的语句 表达式语句和空语句表达式语句和空语句 a+1; ; /空语句空语句 复合语句复合语句 a=a+1,b=b+1,c=c+1; 选择语句选择语句- 条件语句条件语句 if() else else if()- 开关语句开关语句 switch() case:break; case:break; default:; 373.5.1 C+的语句的语句(续续) 循环语句循环语句 while(); do while(); for(;); 转向语句转向语句 label1: 语句语句1 ; ; goto label1; / 跳转到语句跳转到语句1 break; / 退出整个循环退出整个循环 continu
22、e; / 退出本次循环,进入下一个循环退出本次循环,进入下一个循环383.5.2 例例(略略)393.6 C+程序结构和编译环境程序结构和编译环境由类由类(class)和函数和函数(function)组成组成403.6.1 C+程序实例程序实例#include / 预处理预处理#include / 类类 stackint 定义体定义体void main() / 函数函数 int j=3; / 内部类型变量内部类型变量 stackint si(10); / 类的对象类的对象 si.push(10); / 类的成员函数类的成员函数 j=si.pop(); cout “Hello, world!”
23、endl; / 输入输入/输出输出 cout “j=“ j memory a.exe - memory 执行执行 memory - CPU memory - CPU43作业:作业: 编写一函数,判断编写一函数,判断N(1N100000)N(1N100000)是否为素数是否为素数? ?2. 2. 解释下列程序段的功能:解释下列程序段的功能: int n; int a = 0 x1f; / (00011111)2 if(n&a = a ) cout n ;3. 3. 编写一程序,输入全班编写一程序,输入全班4040名同名同学的姓名学的姓名( (字符串字符串) )、学号(如、学号(如PB98011001PB98011001)、语文成绩、数学)、语文成绩、数学成绩、外语成绩;保存在结构体成绩、外语成绩;保存在结构体数组中。然后对此结构体数组排数组中。然后对此结构体数组排序,使得排序后的结构体数组中序,使得排序后的结构体数组中的元素按学生平均成绩非递增有的元素按学生平均成绩非递增有序。序。