




已阅读5页,还剩372页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C+程序设计,吉林大学 软件学院,教师邮箱: 参考书: C+程序设计教程 钱能 清华大学出版社 第2版 课堂纪律: 上机:,第一章:概 述,1-1 培养目标 理解和掌握c+语言的基本语义和语法,初步理解面向对象的思想,初步掌握面向对象的程序设计方法。 提高编程能力和调试程序的能力,为后面的学习打好基础。,1-2 C语言与C+语言,C语言回顾: 1972年 bell实验室研制 C语言特点: 高度灵活性、实现上的高效性 (比FORTRAN) 简捷和高效 (比Pascal),C语言局限: 程序达到一定规模时,模块之间的协调性存在问题,程序的重用性也存在问题,程序员难以控制程序的复杂性。,C+产生: 1980年 贝尔实验室 Bjanre Stroustrup 对C改进与扩充 最初称为“带类的C”,(c with classes). 1983年正式命名为C+ 3次修订后 1994 年制定了ANSI c+草案 1998年11月,ISO标准被批准。,C+是C的改进与扩充 C+包括C的全部属性、特征、优点,是在C的基础上的改进与扩充 C+是C语言改进的基础上,添加了对面向对象程序设计部分的支持 C+包括过程性语言和类部分 C+是C的超集,C是C+的子集 C+是混合型语言,即是过程型的,又是面向对象型的,1-3 面向过程的程序设计,“面向过程”是一种以事件为中心的编程思想。 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。,1-4 面向对象程序设计的基本特征,1. 对象 一个对象是客观世界的一个实体 数据与数据处理过程作为一个整体对象 C+采用“类”来支持对象,同类对象抽象出其共性,形成类,类封装了数据与处理数据的过程(函数),2. 继承与重用 举例 C+采用继承支持重用。 可通过继承现有类,并对其进行扩展,生成新类,即新类是从现有类派生出来的,成为派生类。,3. 多态性: 多态性指同一个操作在不同的类上有着不同行为。,1-5:举例比较面向对象和面向过程 程序设计,例如五子棋, 面向过程的设计思路就是首先分析问题的步骤: 1、开始游戏, 2、黑子先走, 3、绘制画面, 4、判断输赢, 5、轮到白子, 6、绘制画面, 7、判断输赢, 8、返回步骤2, 9、输出最后结果。 把上面每个步骤用分别的函数来实现,问题就解决了,而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为: 1、黑白双方,这两方的行为是一模一样的, 2、棋盘系统,负责绘制画面, 3、规则系统,负责判定诸如犯规、输赢等。 第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,同时利用第三类对象(规则系统)来对棋局进行判定。,面向过程和面向对象不是对立的 面向过程和面向对象将长期并存 从程序机构上,c+的单一程序体本质上是基于过程的,因为运行程序时,总是启动过程。,/* this is a simple c+ program*/ #include using namespace std; / #include int main( ) int a,b,result; cout ab; result=3*a-2*b+1; cout“result is “resultendl; return 0; ,1-6 C+的程序结构,1.预处理命令: 宏定义命令、文件包含命令和条件编译命令 2.输入和输出: 3.函数: 4.语句:是组成程序的基本单元。以分号结束。 5.变量: 6.其他:如符号常量和注释信息。 C+中尽量把常量定义为符号常量 #define PI 3.1415 const double PI=3.1415;,1-7 C+程序的实现,编辑、编译、运行 1.编辑:将编写好的C+源程序输入到计算机中,生成磁盘文件的过程。磁盘文件的名字要用扩展名.cpp。 2.编译:C+程序的实现必须要使用某种C+语言的编译器对程序进行编译。功能是:将程序的源代码转换成为机器代码的形式,称为目标代码(.obj),然后,再使目标代码进行连接,生成可执行文件(.exe)。 编译过程可分为三个子过程:预处理过程、编译过程、连接过程,(1)预处理过程:执行预处理命令 (2)编译过程: 进行词法分析和语法分析的过程,又称源程序分析的过程。 符号表:又称字典。映射程序中的各种符号及其他们的属性。是在进行词法分析和语法分析是生成的,在生成中间代码和可执行的机器代码时使用。 错误处理程序: 生成目标代码:.OBJ为扩展名的磁盘文件,机器可识别文件内容,却不能执行。 (3)连接过程:编译器对每个源文件单独进行编译,多个源程序的目标代码以及库文件(.Lib)连接在一起,才能形成可执行文件(.exe)。由连接器完成. 3.运行:,上机环境: Visual c+ 6.0 Visual studio 2010,一个C+程序有一个主函数, 主函数是程序执行的开始点。 C+ 不允许函数定义嵌套。 函数有两种:标准库函数和用户自定义函数。,第二章 函 数,2-1 内联函数,内联函数也称内嵌或内置函数,它的语法格式与普通函数一样,只是在函数原型或函数定义标题头之前加上关键字inline。 inline int isnumber(char); inline int isnumber(char ch) return(ch=0 ,编译器为内联函数创建一段源代码,每遇到一次该函数的调用都用相应的一段代码来代替。 内联函数主要是解决运行效率的问题。使用内联函数可以省去函数调用所需的建立栈内存环境,进行参数传递,产生程序转移的时间开销 内联函数应是使用频率高,代码却很短的函数。,内联函数必须在调用之前声明或定义。 #include using namespace std; inline int isnumber(char); / int isnumber(char);(则正常函数调用) int main() char c; while (cinc ,此处inline可省略,内联函数的函数体限制: 内联函数中,不能含有switch和while。 递归函数不能用来做内联函数。 内联函数中不能说明数组。 否则,按普通函数调用那样产生调用代码。 (内联函数是建议性,不是指令性) 内联函数只适合于1-5行的小函数 类结构中所有在类内部定义的函数,都是内联函数。,2-2 重载函数,int abs(int); long l_abs(long); double d_abs(double); 重载函数: int abs(int); long abs(long); double abs(double); C+用一种函数名技术可准确的判断出应使用那一个函数。 abs(-10); /调用int abs(int); abs(-1000000); /调用long abs(long); abs(12.3); /调用double abs(double);,简化编程,在编程逻辑上,亲近了人类的思维,在同一作用范围中为多个函数定义(其功能通常是相近的)指定一个共同的函数名,委托编译器根据每一个单独函数的形参个数、类型和位置的差异 ,在幕后进行名称细分并选择合适的函数调用匹配的现象称为函数重载。 void print (double); void print (long); void print(double,char*); void print(char*,double); void f( ) print (1L);/print(long) print (1.0);/print(double) print (2.0,”hello”);/print(double,char*) print (”hello”,3.0);/print(char*,double) ,让重载函数执行不同的功能,是不好的编程风格。,匹配重载函数的顺序: (1)严格匹配 (2)内部转换(相容类型匹配) (3)通过用户定义的转换寻找求一个匹配。 void print(int); void print(double); void function() print(3); print(5.0); print(a); print(3.1415f); ,void print(long); void print(double); void function() int a; print(a);/有二义性 ,print(long(a); 或者print(double(a);,重载的内部实现: C+用名字粉碎(name mangling)(名字细分、名字压轧)的方法来改变函数名。 用v,c,i,f,l,d,r 分别表示void,char,int,float,long,double,longdouble. int f (char a); / f_c int f (char a,int b,double c); /f_cid,返回值类型不能够作为重载依据(区分、细分重载) void func (int); int func ( int); fucn(10); /error 这样规定保证对重载的解析与环境无关 float sqrt(float); double sqrt(double); void f(double da,float fla) float fl=sqrt(da); /调用sqrt(double) double d=sqrt(da); /调用sqrt(double) fl=sqrt(fla); /调用sqrt(float) d=sqrt(fla); /调用sqrt(float) ,2-3 默认参数的函数,默认参数也称为缺省参量。 例: void delay(int loops); void delay(int loops) if (loops=0) return; for (int i=0;iloops;i+); 允许函数默认参数值,是为了让编程简单,让编译器做更多的检查错误工作。 默认参数函数的声明 当又有声明又有定义时,定义中不允许默认参数。 若只有定义,则默认参数才可出现在函数定义中,将loops 定义成默认值为1000 void delay(int =1000); 调用时:delay(); delay(2000);,默认参数的顺序规定: 一个函数中可以有多个默认参数,默认参数应从右至左逐渐定义,当调用函数时,从左向右匹配参数。 例:void foo(int a, int b, bool c); void foo(int a, int b, bool c = false); /ok,c是最后一个参数 void foo(int a, int b = 0, bool c); /fail,b不是最后一参数,当调用有默认参数的函数时,从左向右匹配参数。 #include using namespace std; void fun(int a=1,int b=3,int c=5) cout“a=“a“,“ “b=“b“,“ “c=“c“,“endl; int main() fun(); fun(7); fun(7,9); fun(7,9,11); cout“OK“; return 0; ,默认值的规定: 默认值可以是全局变量、全局常量、函数。不可以是局部变量。因为默认值是在编译时确定的,必须是静态确定的。,函数重载与函数默认参数: (1)默认参数不能用于细分重载函数。 例1: void func(int,int); void func(int=3,int=4); func(22,32);,例2:void func(int); void func(int,int);是重载函数 而void func(int); void func(int,int=4); 在 func(3)调用时有二义性 应该避免重载过程中的涉及参数个数的默认设置,(2)函数重载与函数默认参数: 默认函数可将一系列简单的重载函数合成为一个。 int month,int day,int year; void Tdate() month=4; day=15; year=1995; void Tdate(int m) month=m; day=15; year=1995; void Tdate(int m,int d) month=m; day=d; year=1995; void Tdate(int m,int d,int y) month=m; day=d; year=y; void Tdate(int m=4,int d=15,int y=1995) month=m; day=d; year=y; ,int main() Tdate(); Tdate(1); Tdate(1,2); Tdate(1,2,3); return 0; ,重载函数的功能相同,只是参数个数不同,用默认参数值的方法比较简便,如果参数值用来确定不同的操作,则用函数重载比较好 #include using namespace std; void print(); void print(int *); int main() int arr10; int sum=0; for (int i=0;iarri; sum=sum+arri; if (sum100) print(arr); else print(); return 0; ,void print(int * pa) cout“the array can be used“endl; for (int i=0;i10;i+) coutpai“ “; coutendl; void print() cout“the array can not be usedendl“; ,无名参数 函数的定义和声明中,都可以省略形参名. void print (int ,int); void print(int a,int) coutaendl; void func() print(1,2); ,2-4: 程序运行时的内存布局,(1)代码区(code area):存放程序的代码(各个函数的代码块) (2)全局变量区(data area):存放程序的全局数据和静态数据 (3)堆区(heap area) :存放程序的动态数据 可以用malloc()与free()以及new和delete 来申请与释放堆内存,也称动态内存、动态数据区。 (4)栈区(stack area):存放程序的局部数据(各个函数中的数据),3-1:指针 1.指针变量的定义与赋值 指针是一种数据类型,用于存放内存单元的地址。 int * ip; 定义同时赋值:int a; int *p=,第三章: 指针和引用,3.与地址相关的运算 * 和 “ & ”称为取地址运算符,用来得到一个对象的地址。一元运算符。 * 和 &是两个互逆的操作,当这两个操作符碰到一起时,其作用相互抵消,例如 *&k=3 与 k=3 效果完全相同,4.用指针处理数组元素 例: int *p,i,a6=0,1,2,3,4,5; p=a; for(i=0;i6;i+) printf(“%d”,_); ai *(a+i) pi *(p+i) *p+ *a+ 考虑: 的作用 和*的比较; 越界访问 数组名和指针,(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组; (2)数组名的外延在于其能够转换为指向其指代实体的指针,而且是个指针常量; (3)数组名作为函数形参时,在函数体内,其失去了本身的内涵,仅仅只是个指针;,#include using namespace std; void arrayTest(char str) /char *str, char str10 cout sizeof(str) endl; cout+strendl; int main() char str110 = “Y and me”; arrayTest(str1); return 0;,5. void 指针与NULL指针值 (1)void 指针(void *p) 空类型指针 不指向任何类型,仅仅是一个地址。 不能进行指针运算,也不能进行间接引用。*p 其他类型指针可以赋值给空类型指针 空类型指针经显示转换后方可赋给其他指针。 int a=30; int *ip=,(2)NULL是空指针值,不指向任何地方。任何类型的指针都可以赋该值。 int *ptr = NULL; int *ptr = 0; NULL与void*是不同的概念,6. 指针和常量 const 说明符 const 为指定说明符(也称为常类型说明符),使用指定时,程序执行的过程中指定的内容不能被改变(冻结)。即一次初始化后,指定的内容始终不变。 (1)定义一般常量 使用const 说明常量:int const x=2; 或const int x=2; 定义或说明一个常数组可采用如下格式: const 或者 const double const a2=1.0,2.0 常量定义时,应被初始化。 const int i5; i+;(错误); const int i;必须初始化; C 中常量定义用#define PI 3.14159 c+中使用const double PI=3.1415; 积极使用const, 避免使用宏,可以用const、enum定义常量。,(2)指针常量和常量指针(指向常量的指针) 指针常量:在指针定义语句的指针名前加const, 表示指针本身是常量。 int a; int* const p= 均可。 以上定义表明,*pi是常量,不能将*pi作为左值进行操作。 定义指向常量的指针时,定义时不必须先初始化。,例:指针常量 int a10; int * const p=a; int b6; p=b; / 错误 *p=6; / 正确 *(p+6)=6; / 正确 *p+7; / 错误 const int c0; int *const q / 错误(a本身不能被修改就不允许外界提供修改的漏洞),(3)指向常量的指针常量(常量指针常量) 形式: const int *const p,重载和const形参 (1) void f(int* p); void f(const int* cp);/有效重载,是不是指向const对象 (2) void f(int* p ); void f(int * const pc);/无效重载,重定义不能基于指针本身是否const 实现重载,7. 堆内存的分配 1堆内存(heap):堆是一块内存区域,堆允许程序在运行时(而不是编译时),申请某个大小的内存空间。堆内存又称为动态内存。 2获得堆内存 c中用函数malloc()(在头文件malloc.h中)来获得堆内存;c+中用操作符new来获得堆内存。 3释放堆内存 c中用函数free()(在头文件malloc.h中)来释放堆内存;c+中用操作符delete来释放堆内存。,使用malloc申请空间 void *malloc(unsigned long size); 例: #include “stdio.h” #include “malloc.h” int main() int *p,i; p=(int *)malloc(10*sizeof(int); for(i=0;i10;i+) scanf(“%d”,p+); p-=10; for(i=0;i10;i+) printf(“%d”,pi); free(p); /只能释放malloc申请的空间 return 0; ,使用new和delete进行动态内存分配和释放 运算符new和delete是C+新增的运算符,提供了存储的动态分配和释放功能。它的作用相当于C语言的函数malloc()和free(),但是性能更为优越。 使用new和delete: (1) new 类型 (初始化值) ; int *p; p=new int (100);/动态分配一个整数并初始化 delete p; (2)new 类型 数组大小 int *p;p=new int10; /分配一个含有10个整数的整形数组 delete p; /删除这个数组 使用new较之使用malloc()有以下的几个优点: (1)new自动计算要分配类型的大小,不使用sizeof运算符,比较省事,可以避免错误。 (2)自动地返回正确的指针类型,不用进行强制指针类型转换。 (3)可以用new对分配的对象进行初始化。 (4)不用使用头文件声明(malloc.h),更简洁。,include “stdio.h” int main() int *p,i; p=new int10; for(i=0;i10;i+) scanf(“%d”,p+); p-=10; for(i=0;i10;i+) printf(“%d”,pi); delete p; /只能释放new申请的空间 return 0; ,new操作符若申请成功,返回首单元地址;否则返回NULL值。 int *p=new int10; if (p=NULL) /if (!p) 或者 if (p=0) cout“cant allocate more memory!n”; exit(1); /exit是在调用处强行退出程序 /exit(1)表示异常退出. exit(0)表示正常退出,动态空间 : 动态申请二维数组 #include “stdio.h” int main() int *p,i,j; p=new int *3; for(i=0;i3;i+) pi=new int3; for(i=0;i3;i+) for(j=0;j3;j+) scanf(“%d”,*(p+i)+j); for(i=0;i3;i+) for(j=0;j3;j+) printf(“%d“,pij); for(i=0;i3;i+) delete pi; delete p; return 0; ,8.函数指针和指针函数 (1)指针函数:返回指针值的函数。 定义格式:类型修饰符* 函数名(形参表) 函数体 int* f(int a); (2)函数指针:指向函数地址(程序区)的指针。与函数名等价的指针。函数名是指向函数的指针常量。 函数指针定义 若函数原型为:类型 函数名(形参表); 则相应函数指针定义为: 类型 (*变量名) (形参表);/()的优先级大于* char *p(int); char (*p)(int ); 例:int f1(int n); int (*pf1)(int n); pf1=f1;/pf1是与f1等价的函数指针 指针函数用来申请空间或者查找数据; 函数指针用来临时制定参与运算的函数;,(3)通过函数指针来调用函数 例: int add(int a,int b)return a+b; int main() int (*p)(int,int); p=add; /p是与add等价的函数指针 coutadd(3,5); cout(*p)(3,5); /四种调用形式效果等价 coutp(3,5); cout(*add)(3,5); return 0; 结果:8888,4函数指针作函数形参 例:计算以0.10为步长,特定范围内的三角函数之和。 #include using namespace std; #include double sigma(double(*func)(double),double dl,double du) double dt=0.0; for(double d=dl;ddu;d+=0.1) dt+=func(d); return dt; int main() double dsum; dsum=sigma(sin,0.1,1.0); cout“the sum of sin from 0.1 to 1.0 is“dsumendl; dsum=sigma(cos,0.5,3.0); cout“the sum of cos from 0.5 to 3.0 is“dsumendl; return 0; ,5.用typedef 来简化函数指针 (1)typedef int (*FUN)(int a,int b); int f(int,int); FUN funp=f; FUN 不是指针变量,是指针类型名。 (2)typedef int FUNC(int,int); /先定义函数类型 FUNC* funp=f; 6.函数的返回类型可以是函数指针 typedef int (*SIG) (); typedef void (*SIGARG) (); SIG signal (int,SIGARG);,3-2 引 用,1.引用(reference)的概念 为一个变量、函数等对象规定一个别名,该别名称为引用。此后,对别名的操作即是对别名所代表的对象的操作。,对象:存储器中一片连续的区域; *(a+10)=7 左值:就是引用某个对象的表达式,2声明引用:声明引用格式如下: 格式:类型标识符 /rp2代表p所指向的那个对象, /即数组元素a0,3引用必须初始化。引用一旦被声明则不能再修改. Int j,k; int ,void /error void 本质不是一个类型,只是在语法上相当于一个类型,没有该类型的对象。,4、引用的使用参数传递 void swap(int,形参和实参结合规则: 形参为引用时,形参(引用)接收实参(对象)的地址。 或表述为: 形参为引用时,凡遇到形参(引用)的地方,全部用实参(对象)来代替。 传递引用给函数与传递指针的效果相同。 可读性比指针传递好(传值方式的调用与可读性,性能却强于传值方式) 参数结合符合初始化标准 可使用引用传递从函数返回多个值(指针和引用都可以),5.引用和指针的关系 指针是个变量,可再赋值; 而引用建立时必须进行初始化并且决不会再关联其它不同的变量。 指针操纵两个实体(指针值、指向的值);引用只能操纵一个实体。 引用在内部用指针实现 ,被看成是指针常量,不能操作自身的地址值,只能访问所指向的实体。 在语言层面,引用的用法和对象一样;在二进制层面,引用一般都是通过指针来实现的,只不过编译器帮我们完成了转换 实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”? 答案是“用适当的工具做恰如其分的工作”。 指针能够毫无约束地操作内存中的东西,尽管指针功能强大,但是非常危险。 引用是指针出于安全考虑的替代品。,在以下情况下你应该使用指针: 一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空) 二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。 如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。,6.用const 限定引用 用const 限定引用声明方式: Int i; const int 效率相同,double 注意:c+不分变量的const引用,和const变量的引用,因为引用本身就不能重新赋值,使它指向另一个变量。 即没有const int const &a=1, 只有const int &a=1,7.引用的使用用引用返回值 float t; float f1(float r) float k; k=3.14*r*r; cout“f1:k is“ ,int main() float a=f1(5); const float ,f1:k is0x0013FF08 f1:k is0x0013FF08 b:0x0013FF74,f2:t is0x0042DD68 f2:t is0x0042DD68 d:0x0042DD68,f3:f is0x0013FF08 e=5.88384e-039,用普通的返回值的方法返回一个函数的函数值时,需在内存中先创建一个临时变量, 在被调函数返回时,将函数值复制到该临时变量中, 主调函数再以该临时变量的值进行运算。这种方法产生了函数值的副本。 用引用返回一个函数值的最大好处是:在内存中不产生被返回值的副本。 别返回一个局部对象的引用。,8.引用的使用函数调用作为左值 int a=0,b=0,c=0; int ,9.返回堆中变量的引用 int ,练习题 char a =“abcdefghij“; char *q=a; int *p=(int *)a; while(*q) *q+=*q+1; p+=2; printf(“%s“,p); /sizeof(char)=1 /sizeof(int)=4,分析程序,写出结果:#include void main() int* p; int*,第四章: 类,1.从结构到类 结构:相关联的数据元素组成一个单独的统一体 struct Savings unsigned accountnumber; /账号 float balance; /结算额 ; ;是必需的 struct Savings a,b; 或者 Savings a,b; 常用形式 结构分量称为成员,使用“.”操作符访问成员 void fn() Savings a; Savings b; a.accountnumber=1; b.accountnumber=2; ,粗糙的数据类型,没有涉及复合数据的操作。,C的结构中不含有成员函数。 C+的类中既能包含数据成员,又包含函数成员或称成员函数。 class Savings public : float deposit(float amount) /成员函数 balance+=amount; return balance; unsigned accountnumber; /数据成员 float balance; /结算额 ; /类的声明时不分配内存空间 void fn() Savings a,b; /对象 (对象和变量) Savings *pa= / .的前面是对象,-的前面是地址,成员函数的调用一定是和某个对象捆绑在一起,一个类的一般构造: class class_name_identifier public: 公共数据成员声明语句; 公共函数成员声明语句; private: 私有数据成员声明语句; 私有函数成员声明语句; protected : 保护数据成员声明语句; 保护函数成员声明语句; ;,C+中类与结构的区别 struct Savings public : /可省略 float deposit(float amount) balance+=amount; return balance; private: int accountnumber; float balance; ;,class Savings private: /可省略 int accountnumber; float balance; public : float deposit(float amount) balance+=amount; return balance; ;,C+中类与结构的区别: 默认情况下,class定义的成员是private的,而struct 定义的成员是public的。,2.对象的引用以及返回对象的函数 class Student public: int age; char name9; float score; ; int main() void add(Student ,void add (Student ,3. 公有,int main() Student a; a.p(); a.q(); a.score=80; a.age=20; /错误 a.add(); /错误 a.r(5); a.r(int)(a.score); a.r(a.age); /错误 return 0; ,4.成员函数,void p(int a) couta; int main() Student a; a.p(); p(a.q(); return 0; ,成员函数与普通函数的区别: 成员函数属于类, 成员函数定义是类设计的一部分, 其作用域是类作用域. 而普通函数一般为全局函数 成员函数的操作主体是对象,使用时通过捆绑对象来行使其职责, 而普通函数被调用时没有操作主体,5. 重载成员函数 class Student public: float grade()/ float grade(float newgpa)/ protected: /. ; class Slope public: float grade()/ protected: /. ; char grade(float value)/,void main() Student s; Slope t; s.grade(3.2); float v=s.grade(); char c=grade(v); float m=t.grade(); ,6.定义成员函数 (1)在类的内部定义成员函数 #include using namespace std; class Tdate public: void set (int m,int d,int y) month=m;day=d;year=y; int isleapyear() return (year%4=0,int main() Tdate a; a.set(2,4,1998); a.print(); if (a.isleapyear() cout“is leapyear!“ else cout“is not leapyear!“; return 0;,Set 与month 全名 :作用域区分符、作用域运算符、名字空间引导符,例:用:表示全局变量和函数 int month; int day; int year; void set (int month,int day,int year) :month=month; :day=day; :year=year; class Tdate public: void set (int m,int d,int y) :set(m,d,y); private: int month; int day; int year; ;,类内部提供的成员函数定义默认为内联函数。 类中定义的成员函数一般规模较小(1-5句) 不能使用结构化语句 类定义一般在头文件中,便于多个程序使用。,/例子 文件名Student.h class Student public: void p() age = 19; coutage; float score; protected: char name; int age; ;,a.cpp #include “Student.h” main() Student a; a.p(); b.cpp #include “Student.h” void hh() Student a; a.p(); /类定义和使用的分离,(2)在类之后定义成员函数 class Tdate public: void set (int m,int d,int y); int isleapyear(); void print(); private: int month; int day; int year; ;,void Tdate:set (int m,int d,int y) month=m;day=d;year=y; int Tdate:isleapyear() return (year%4=0 void Tdate:print() cout month“/”day“/”yearendl:,类定义和成员函数定义的分离 /tdate.h(类的定义) class Tdate public: void set (int m,int d,int y); int isleapyear(); void print(); private: int month; int day; int year; :,/tdate.cpp(类的实现) #include using namespace std; #include “tdate.h” void Tdate:set (int m,int d,int y) month=m;day=d;year=y; int Tdate:isleapyear() return (year%4=0 void Tdate:print() cout month“/”day“/”yearendl:,/pmain.cpp #include “tdate.h” int main() Tdate a; a.set(2,4,1998); a.print();,从上图中观察可以得知: 1,整个源程序由3个单独的文件构成。 2,两个.cpp文件分别编译生成各自目标文件。 3,两个目标文件和库文件连接生成可执行程序。,tdate.cpp #include #include “tdate.h“,tdate.h,Pmain.cpp #include “tdate.h“,tdate.obj,Pmain.obj,可执行文件pmain.exe,编译,编译,连接,连接,注意: :用于c+提供的头文件,一般存放在c+系统目录中的include 子目录下 “ ”:首先在当前文件所在的目录中进行搜索,找不到,再按标准方式进行搜索.,/成员函数的实现和类定义一起放在头文件中 文件名Student.h class Student public: void p(void); float score; protected: char name; int age; ; void Student:p() coutage /直接放在了h文件中,文件名aa.cpp #include “student.h” void main() void f(); Student a; a.score=80; couta.score; a.p(); f(); 文件名bb.cpp #include “student.h“ void f() Student a; a.score=90; a.p(); /提示void Student:p()被重复定义,c+的名称有 外部链接:函数定义,可以在其他文件中使用。不能重复定义。 内部链接:只能在自己的程序中使用,可以跨文件重复定义。如:类型定义、全局常量、inline函数、模板定义等。,/头文件在一个文件中多次被包含 文件名Student.h class Student public: void p() coutscore; float score; protected: char name; int age; ;,文件名ss.h #include “student.h“ class ss public: Student *a; float f; ; 文件名bb.cpp #include #include “student.h“ #include “ss.h“ void main() Student a; ss s; a.score=80; ss.f=50; /提示 Student类被重复定义,头文件卫士 文件名Student.h # ifndef STUDENT # define STUDENT class Student public: void p() coutscore; float score; protected: char name; int age; ; #endif /头文件卫士保证头文件在一个程序文件中只被定义一次,文件名ss.h #include “student.h“ class ss public: Student *a; float f; ; 文件名bb.cpp #include #include “student.h“ #include “ss.h“ int main() Student a; ss s; a.score=80; ss.f=50; return 0; ,#ifndef _INC_IOSTREAM #define _INC_IOSTREAM,6.程序的文件机制,文件,文件,文件,头文件的使用:使函数调用免于声明,/ abc.h void f1 ( ); void f2 ( ); void f3 ( ); void g1 ( ); void g2 ( ); void p ( ); void h ( );,/ a1.cpp #include”abc.h” void f1() if() p(); g1(); else g2(); h(); ,/ a2.cpp #include”abc.h” int main() f1(); f2(); f3(); /- void f3() f1(); /- void p() f3(); /-,界面头文件(上),/ a1.h a1.cpp提供的资源 void f1(); / a2.h a2.cpp提供的资源 void p(); / a3.h
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 离职管理制度
- 医学逸事小趣闻
- 石膏板吊顶构造工艺流程
- 《人际交往与性格塑造》课件
- 辅助生殖妇女妊娠管理
- 餐饮促销活动策划方案
- 东风日产销售培训体系
- 自动化管理介绍
- 《聋人与瘫痪者》课件
- 医学机制核心解析与分类框架
- 2025年上海市静安区初三二模语文试卷(含答案)
- 水泥预制构件及建材项目可行性研究报告参考范文
- 建设工程质量检测标准化指南•技术示范文本 检测专项检测报告和原始记录模板 -(九)桥梁及地下工程大类
- 林下经济产业项目可行性研究报告
- 2025年青岛市局属公办高中自主招生化学试卷试题(含答案解析)
- AI在医疗机器人领域的应用前景与挑战
- 2025年全民营养周科学实现吃动平衡健康中国营养先行课件
- 卖车合同协议书模板下载
- 非标自动化设备设计培训
- 行政检查业务培训课件
- 主题班会少年强则国强纪念五四青年节【课件】
评论
0/150
提交评论