




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C+面向对象程序设计学习目的:本课程是计算机技术专业的一门专业技术基础课。本课程的学习目的是:理解并掌握面向对象程序设计的基本概念与方法,进而学会利用C+语言解决一般应用问题,并为后续的专业课程奠定程序设计基础。通过本课程的讲授、上机实验及习题等教学环节的实施,使学生达到以下基本要求:l 理解并掌握面向对象程序设计的一些基本概念和方法;l 以c+语言中的面向对象机制为主,使学生逐步掌握c+的面向过程和面向对象的功能,从而掌握面向对象程序设计的基本知识和基本技能。l 树立软件工程的思想,培养良好的、规范的编程风格;突出面向对象程序设计的思想学习方法和特点1 从三个方面进行技能培养的要求:掌握基本知识;大量阅读实例;编写程序实践。2 注重实例的阅读和理解。3 注重实践课的学习。4 注重自学能力的培养(提倡:以学为主,以教为辅)。学习要求1 做好理论课前、课后的预习和复习2 做好实习课前、课后的准备和总结3. 访问学习网站: 4阅读参考书籍: 面向对象的程序设计 刘加海 著 科学出版社C+程序设计教程 钱 能 著 清华大学出版社C+程序设计教程(美)H.M.DEITEL等清华大学出版社第一章 C+初步知识1. 1 C+的产生和特点一、C+的产生二、C+的特点12 C+程序的结构特性一、一个简单的C+示例程序二、C+程序的结构特性13 C+对C非面向对象方面的扩充一、c+的输入输出流二、用const定义常变量三、函数的原型声明四、函数的重载五、函数模块六、带有缺省参数值的函数七、变量的引用八、内置函数(内联函数)九、作用域运算符十、字符串变量十一、动态存储管理运算符new和delete 14 C+程序的编写和实现15 关于 C+的上机实践第一章 C+初步知识1.1 C+的产生和特点一、C+的产生C的局限性:1不支持代码重用;2难以控制程序的复杂度,不适合开发大型程序。二、C+的特点1C+全面兼容C、运算符更加丰富;2程序可读性更好、结构更合理、3更高质量的代码;4有很强的数据处理能力、更强的软件开发效率5支持面向对象的机制二、C+的作用1. 求解计算问题2. 大量数据的处理3. 编写应用软件4. 编写系统软件5. 编写游戏软件12 C+程序的结构特性一、简单的C+示例程序例1.1 输出一行字符(P2例1.1)#includeusing namespace std; /使用命名空间std 参考P282283 标准C+要求int main() /标准C+ int main() P2注释 cout”this is a C+program.n”; return 0;例1.2-1 两数相加(P3例1.2)#include /预处理命令using namespace std; /使用命名空间stdint main() /主函数首部 /函数体开始int a,b,sum; /定义变量cinab; /输入语句sum=a+b; /赋值语句couta+b=sumendl; /输出语句return 0; /如程序正常结束,向操作系统返回一个零值例1.2-2 两数相加(用函数实现)#includeusing namespace std;int add(int a,int b); int main() int x,y,sum; coutenter two numbers:xy; sum=add(x,y); coutthe sum is :sumn; return 0;int add(int a,int b) int c; c=a+b; return c;例1.3 输入两个数x和y,求其较大者(P4例1.3)#include using namespace std;int main() int max(int x,int y); /对max函数作声明 int a,b,c; cinab; c=max(a,b); /调用max函数 coutmax=cy) z=x; else z=y; return(z); 二、C+程序的结构特性例14 典型的C+程序结构#include using namespace std;class Student /声明一个类,类名为Student private: /定义类的私有部分成员 int num; int score; char name20; public: /定义类的公有部分成员 void setdeta( ) cinnum; cinscore; void display( ) cout”num=”numendl; cout”score=”scoreendl; ; /类的声明结束Student stud1,stud2; /定义类的对象int main( ) stud1.setdata(); /调用对象stud1的setdata函数 stud2.setdata(); stud1.display(); stud2.display(); return 0;例15 典型的C+程序结构#include using namespace stdclass Sample private: int x,y; /类Sample的数据成员声明public:Sample() /声明类Sample的无参构造函数,为对象的数据成员初始化 x=y=0; Sample(int a,int b) /声明类Sample的有参构造函数 x=a;y=b; void disp() /类Sample的成员函数声明 cout”x=”x”,y=”yendl; ;int main() Sample s1,s2(1,2); /创建两个类Sample的对象s1,s2s1.disp(); /调用成员函数disp()s2.disp(); return 0;此程序的运行结果为:x=0,y=0x=1,y=2 从以上案例中可以看出典型的C+程序具有以下的基本结构#include using namespace std;/类的声明部分class A int x,yz; /类A的数据成员声明fun ( ) /类A的成员函数声明;/类的使用部分int main()A a; /创建一个类A的对象aa.fun(); /调用成员函数fun() return 0;说明:1C+程序的书写格式与C相同2两种注释符号(1) /* */(2) / (适合不超过一行的注释)3灵活的变量说明 C+允许在代码块中的任何地方说明局部变量,其作用域是从其说明点到该变量所在的最小分程序末的范围内有效。4教材采用标准的C+格式编写如:#include using namespace std;13 C+在非面向对象方面的扩充1.3.1 、C+的输入输出流(P8)在C+中,将数据从一个对象到另一个对象的流动抽象为“流“,如:每次输入或输出都可以看做是数据流。数据的输入与输出时通过I/O流来实现的。1输出操作标准输出流cout与流插入运算符 联用,可实现一般的屏幕数据输出。一般格式如下: cout表达式表达式说明:(1)在输出语句中,可以串联多个插入运算符,输出多个数据项。例1.6 cout的应用#include using namespace std;int main() cout”hellon”; cout”how are you?”; cout”My name is Alice”; coutendl; return 0;可写成:cout”hellon”how are you?”My name is Alice”endl;(2)在插入运算符后面可以是任意复杂的表达式,系统将自动计算出它们的值,并传给输入符。例如: cout“3+4=“”联用,可实现一般的键盘输入。一般格式如下: cin 变量1变量2 说明:在输入语句中,提取符可以连续写多个,每个后面跟一个变量。例如: int a,b; cinab;用户在输入多个数据时,各数据之间应用空格分隔。1.3.2 用const定义常变量 (P11)例17 define 的不安全性#includeusing namespace stdvoid main() int a=1; #define t1 a+a /预定义 #define t2 t1-t1coutt2 is t2endl;输出:t2 is 2const的一般形式:const 数据类型名 符号常量名=表达式;例如:const float PI=3.14;例18 用const替代define#includeusing namespace stdvoid main() int a=1; const t1=a+a; /常量定义语句 const t2=t1-t1; coutt2 is t2endl;输出:t2 is 0说明:1. 如果用const定义一个整型常量,关键字int 可以省略;即:const int abc=200 等价于 :const abc=200 2常量一旦被建立,在程序中的任何地方都不能再更改;3函数参数也可用const说明,其目的在于保证实参在函数内部不被更改;4与#define不同,const定义的常量有数据类型、有地址,因此可将const定义的常量与指针结合使用。133 函数的原型声明(P11)C+规定:如果函数调用在函数定义之前,则在函数调用之前必须对所调用的函数进行函数的原型声明。说明函数的名称、参数类型与个数,以及函数返回值的类型,其目的是让C+编译程序时进行类型检查。函数声明的一般格式: 函数类型 函数名(参数表);例1.9 函数原型说明#includeusing namespace stdvoid write(char *s); /函数原型说明int main() write(“hello,world!”); return 0;void write(char *s) couts; 几点说明:(1)函数原型的参数表中可不包含参数的名字,而只包含他们的类型。(2)函数定义由函数首部和函数体构成。函数首部与函数原型基本一样,但函数首部中的参数必须给出名字,而且不包含结尾的分号。(3)主函数main()不必进行原型说明。(5)原型说明中没有给出返回类型的函数,C+默认为该函数的返回类为int。(6)如果一个函数没有返回值,则必须在函数原型中注明返回类型为void。134 函数的重载(P12)1函数重载的含义C+允许创建多个名称相同的函数,称为函数重载。这些同名函数的参数表必须有所区别,这种区别可以是参数类型,也可以是参数个数或两方面兼有。例110 参数类型不同的重载函数 (P12例1。6)求3个数中的最大数(分别考虑整数、实数、长整数的情况#includeusing namespace std;int max(int a,int b,int c)if(ba) a=b;if(ca) a=c;return a;float max(float a,float b,float c)if(ba) a=b;if(ca) a=c;return a;long max(long a,long b,long c)if(ba) a=b;if(ca) a=c;return a;int main()int a,b,c;float d,e,f;long g,h,i;cinabc; cindef;cinghi;int m;m=max(a,b,c);coutmax-i=mendl;float n;n=max(d,e,f);coutmax-f=nendl;long p;p=max(g,h,i);coutmax-l=pendl;return 0;例111 参数个数不同的重载函数 #includeusing namespace std;int add(int x,int y) return x+y; int add(int x,int y,int z) return x+y+z; int main() int a=3,b=4,c=5; couta+b=add(a,b)endl; couta+b+c=add(a,b,c)endl; return 0;2说明(1)返回类型不在参数匹配检查之列;(2)在函数调用时,如果给出的实参和形参不相符,C+的编译器将会自动做类型转换;(不提倡)(3)让重载执行不同的功能,是不好的编程风格。同名函数应具有相同的功能。如果定义一个abs()函数而返回的却是一个数的平方根,则该程序的可读性将受到破坏。135 函数模板(P14)一、模板的概念模板是C+语言中代码重用的一种实现方法。使用模板可以实现用同一代码实现一组相关函数或一组相关类。由于C+的程序结构主要是由函数和类构成的,因此,模板也具有两种不同的形式:函数模板和类模板。根据模板用户可构造模板函数和模板类。模 板(函数模板和类模板)模板函数模板类 对 象实例化实例化实例化二、函数模板的说明所谓函数模板是指:建立一个通用的函数,其函数类型和函数形参类型不具体指定。用一个虚拟的类型来代表。函数模板说明的一般形式:template 返回类型 函数名(模板形参表) /通用函数定义 函数体;或:template 返回类型 函数名(模板形参表) /通用函数定义 函数体;例1.11(P14例1.8)#includeusing namespace std;template /模板声明T max(T a,T b,T c) /定义通用函数if(ba) a=b;if(ca) a=c;return a;int main()int a1=4,a2=5,a3=8,a; float b1=2.3,b2=4.5,b3=1.1, b ; long c1=234561,c2=897766,c3=7877777, c ; a=max(a1,a2,a3); b=max(b1,b2,b3); c=max(c1,c2,c3); coutmax-a=aendl;coutmax-bbendl;coutmax-c=cendl;return 0;说明:1. 关键字typename指定了函数模板的类型参数,表示“任何预定义的数据类型或用户自定义类型”。在使用函数模板时,typename(或class)后面的类型参数要用实际的数据类型替代它。2.函数模板代表的是一类函数,它不是一个实实在在的函数,编译系统并不产生任何代码,只有当将其类型参数T实例化为某一确定的(数据类型如int等),编译系统便生成一个重载函数,该函数的函数体与函数模板的函数体相同。该重载函数称为模板函数。“将函数模板的类型参数T实例化的参数称为模板实参,用模板实参实例化的函数称为模板函数”。例113 定义一个求绝对值的函数模板#includeusing namespace std;templateT abs(T x) return x0?-x:x; int main() int n=-5; double d=-5.5; coutabs(n)endl; coutabs(d)endl; return 0;分析:编译器从调用abs()时实际参数的类型,推导出函数模板的类型参数,例如,调用表达式abs(n)由于实际参数n为int型,所以推导出模板中类型参数T为int。当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:int abs(int x) return x0? x:x; 说明:(1)函数模板代表了一类函数,模板函数表示某一具体的函数;(2)函数模板是定义重载函数的一种工具,一个函数模板是为一种原型函数生成一个模板函数,不同原型的模板函数是重载的,这样就使得一个函数只需编码一次就能用于某个范围不同类型的对象上,因此,可以说函数模板是提供一组重载函数的样板。例114 有两个类型参数的函数模板#includeusing namespace std;templatevoid fun(type1 x,type2 y) coutx yendl;int main() fun(10,hao); fun(0.123,10l); return 0;1.3.6 带有缺省参数值的函数(P16)1引入带有缺省参数值的函数的意义C+允许在函数定义时,为一个或多个形参指定缺省值,则在函数调用时,若缺省了其中的某些实参,C+会自动地以缺省值作为相应的参数值。例如:int init(int x=5,int y=0);则允许有如下调用:init(100,80); /等价于x=100,y=80init(25); /等价于x=25,y=10init( ); /等价于x=5,y=102. 几点说明(1)在函数原型中,所以取缺省值的参数都必须出现在不取缺省值的参数的右边;例: int fun(int I,int k,int j=5);(2)在函数调用时,若某个参数省略,则其后的参数,皆应省略而采用缺省值。(3)一个函数不能既作为重载函数,又作为有默认参数的函数,以避免出现“二义性”。1.3.7 变量的引用1引用的概念(P17)引用是个别名。当建立引用时,程序用另一个变量或对象(目标)的名字初始化它。从那时起,引用作为目标的别名而使用,对引用的改动实际就是对目标的改动。引用通常用在以下几个方面:独立引用;参数传递;传回引用(*)声明一个引用的格式如下:数据类型 &引用名=已定义的变量名;例如 :int a; int &b=a; /声明b是一个整型变量的 引用变量,并且被初始化为a2引用的简单使用(P18)例115独立引用的例子#includeusing namespace std;int main() int i; int &j=i; / j是i的别名; i=30; couti=i j=jn; j=80; / 即改变i的值; couti=i j=jn; coutaddress of i&iendl; coutaddress of j&jendl; return 0; 3.关于引用的简单说明(1)引用不是一种独立的数据类型,它必须与某一种数据类型相联系,即同时对其初始化;例如:int a;int &b=a; /ok int &b; /error,必须同时初始化float a; int &b=a; /error,类型不一致(2)引用不是独立的变量,编译系统不为其单独分配存储单元。(3)引用运算符只在声明时使用,任何其他“&”的使用都是地址运算符。例如: int &r=one; /&是引用运算符 int *p=&one /&是地址运算符(4)对引用的初始化,可以用一个变量名,也可以用另一个引用。例如:int a=10;int &b=a;int &c=b;(5)引用不可重新赋值。不可使其作为另一变量的别名。例如: int i,j; int &j=i; int &j=k; 4将引用作为函数参数(P19)引用作为函数参数的目的:在于扩充函数传递数据的功能。(1)将变量名作为实参。此时,传给形参的是一个变量的值。例:1.16(P19例1.10)无法实现两个变量的值互换的程序。#includeusing namespace std;void swap(int a,int b) int temp; temp=a; a=b; b=temp; int main() int i=3,j=5;swap(i,j);cout”i=”i”,”j=”jendl; /i和j的值未互换return 0; (2)传递变量的指针此时,传给形参的是一个变量的地址。例:1.17(P20例1.11)利用指针变量作形参,实现两个变量的值互换的程序。#includeusing namespace std;void swap(int *a,int *b) int temp; temp=*a; *a=*b; *b=temp; int main() int i=3,j=5;swap(&i,&j);cout”i=”i”,”j=”jendl; /i和j的值未互换return 0; (3)传递变量的别名此时,传给形参的是一个变量的别名。例:1.18(P20例1.12)利用“引用形参”,实现两个变量的值互换的程序。#includeusing namespace std;void swap(int &a,int &b) int temp; temp=a; a=b; b=temp; int main() int i=3,j=5;swap(i,j);cout”i=”i”,”j=”jendl; /i和j的值未互换return 0; 说明:当将一个引用作为参数传递时,编译器实际上传递了调用者中相应变量的地址。在函数调用语句中,无须使用地址运算符&。在函数中使用参数时,也无须使用指针。当将某个引用作为参数传递时,对该参数的所有修改实际上都是对调用者中的相应变量进行。 引用与指针非常相似,但有本质区别:指针变量的内容是一个地址,而引用为变量的别名。注:仔细阅读P21225对引用的进一步说明(P22)(1)不允许对void类型进行引用例如: void &r=10; /error(2)不能建立引用数组例如: int a10; int &ra10=a; /error(3)当使用引用运算符&取一个引用的地址时,其值为所引用的变量的地址。例如: int num=50; int &ref=num; int *p=&ref;则:p中保存的是变量num的地址。(4)可以建立指针变量的引用例如:int i=5;int *p=&i;int *pt=p; /pt是一个指向整型变量的指针变量的引用,初始化为p(5)可以用const对引用加以限定,不允许改变该引用的值int i=5;const int &a=i;a=3; /error, 企图改变引用a的值int i=3; /ok;6用引用返回值(*补充)函数返回引用是调用函数后返回值为为返回变量的一个引用。其目的是:为了将该函数用在赋值运算符的左边。案例1:#includeusing namespace std;int a=1,3,5,7,8;int &index(int);int main() coutindex(2)endl;index(2)=25;coutindex(2)endl;return 0;int &index(int i) return ai; 案例2:#includeusing namespace std;int a10;int &array(int i);int main() int i,number; a0=0; a1=1; cinnumber; for(i=2;inumber;i+) array(i)=array(i-2)+array(i-1); coutarray(i)=array(i)endl;return 0;int &array(int i) return ai; 1.3.8 内置函数(内联函数)(P24)1内联函数的定义及引入的目的inline 返回值类型 函数名称 (参数类型 参数名称。)函数体引入内联函数的目的是:为了提高程序的运行效率。例118 内联函数的使用#includeusing namespace std;inline double circle(double r) return 3.1416*r*r; int main() for(int i=1;i=3;i+) coutr= i area=circle(i)endl; return 0;2几点说明内联函数必须先定义(不是声明),而后再使用;内联函数与宏定义#define具有相同的作用和相似的机理,但消除了#define的不安全因素。比较如下两个案例:例120有参宏的使用#includeusing namespace std;#define doub(x) x*2int main() for(int i=1;i=3;i+) couti” double is “doub(i)endl; cout”1+2 double is “doub(1+2)endl; return 0;运行结果:1 double is 22 double is 43 double is 61+2 double is 5例121 内联函数的使用#includeusing namespace std;inline int doub(int ) return x*2; int main() for(int i=1;i=3;i+) couti” double is “doub(i)endl; cout”1+2 double is “doub(1+2)endl; return 0;运行结果:1 double is 22 double is 43 double is 61+2 double is 6内联函数体内一般不能有循环语句和开关语句;在类结构中所以在类说明体内定义的函数都是内联函数;使用内联函数是一种用空间换时间的措施,一般适用于较短的函数。1.3.9 作用域运算符:(P26)作用域标识符引入的目的:是为了解决局部变量与全局变量的重名问题。即在局部变量的作用域内,可用“:”对隐藏的同名全局变量进行访问。例122作用域标识符的应用1#includeusing namespace std;int aver=10; /全局变量int main() int aver=25; /局部变量 coutaver is averendl; coutaver is :averendl; return 0;注:作用域标识符(:)只能用来访问全局变量。如果在某一局部变量的作用域处有一个同名的变量,但他不是全局变量,就不能用作用域标识符访问他。例123 作用域标识符的应用2#includeusing namespace std;double a; /全局变量int main() int a=1; /局部变量 coutaendl; int a=2; /局部变量 coutaendl; :a=0.5; coutlocal a=aendl; coutglobal doubl a=:aendl; return 0;1.3.10 字符串变量(p26)c+允许其标准库中声明的一个字符串类定义一个字符串变量。1定义字符串变量定义字符串变量的一般格式:string 字符串名;或: string 字符串名=初始化值; 例如:string str1; /定义str1为字符串变量string str2=”program”; /定义str2字符串变量,同时对其初始化注意:引用string类的功能,必须加载头文件#include 2对字符串变量的赋值对字符串变量的赋值的一般格式: 字符串变量=字符串常量或字符串变量例如: string str1,str2; str1=”program”; str2=str1;问题:字符串变量str1、str2的所占的存储空间为多少?3字符串变量的输入输出 cout字符串变量;4字符串变量的运算(P2728)(1)用赋值运算符实现字符串复制 字符串变量1=字符串变量2 例如:str1=str2 /等价于strcpy(str1,str2)(2)用加法运算符实现字符串连接例如:string str1=”C+”;string str2=”program”;string str3;str3=str1+str2;(3)用关系运算符实现字符串比较string str1,str2; str1=”zheng”;str2=”wang”; coutstr2)endl;5字符串数组(P28) string 字符串数组名字符串数组长度例如:string name4=“zhang”,”wang”,”li”,”zhao”; /定义一个字符串数组name,长度为4(包含4个字符串),并初始化问题:(1)name数组的存储格式;(2)数组元素name1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 风电设备防腐处理技术方案
- 分布式光伏项目进度管控实施方案
- 供热系统老旧管网腐蚀防护处理方案
- 高速公路工程竣工验收实施方案
- 排水防涝预警与响应机制方案
- 污水生化处理系统运行管理方案
- 石英岩矿仓储设施建设方案
- 太湖县中医院护理试题及答案
- 数学鸡鸭饲料题目及答案
- 药品取样员考试题及答案
- 中学藏文散文教学课件大纲
- 第4课《乡愁》课件-2025-2026学年统编版语文九年级上册
- 兵役法教学课件
- 第六届山东省无人机技术与应用职业技能竞赛(无人机测绘操控员)题库(含答案)
- 第1章三角形单元测试2025-2026学年苏科版八年级数学上册
- 2025年高级养老护理员职业技能考试笔试试题(附答案)
- PWC平安集团互联网企业预算管理体系介绍
- 2025-2026学年人教版小学数学四年级上册教学计划及进度表
- 高中语文课本中的作文素材(选必上)
- 2025年中国互联网金融协会招聘面试预测题及答案
- 2025年中医确有专长考试题库(附答案)
评论
0/150
提交评论