版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2024/1/151总复习考试题型、范围及安排
基础知识
函数
数组、指针
、结构体类与对象
运算符重载
继承与派生多态性与虚函数2024/1/152考试题型、范围及安排一、考试题型选择题:(单选,1*15)填空题:(1*15)判断题:(1*15)改错题:(每小题一段代码,指出有错误的行号,并改正错误,4*2)程序填空题:(每段程序中缺少几行代码,补上这些代码,7个空,共14分)简答题:(给出一段程序,回答问题,4*3)阅读程序写结果:(6*2)编程题:(9*1)2024/1/153考试题型、范围及安排二、考试范围C语言与C++的内容都会考到以面向对象编程的C++为主三、考试安排时间:5月31日,13周周日,上午三四节地点:新校区B座,1-2班(210)
6班(211)2024/1/155基础知识基本符号:大、小写字母;下划线(不是连接符);数字;标点符号及运算符一、C++的基本元素及基本数据类型标识符:用来标识变量、常量、函数及文件的字符序列只能由字母、数字、下划线组成第一个字符必须是字母或下划线有长度限制且区分大小写2024/1/156基础知识基本数据类型:一、C++的基本元素及基本数据类型整型:(unsigned)int、short、long实型:float、double字符型:(unsigned)char布尔型:bool2024/1/157基础知识++、--、!算术运算符关系运算符&&、||赋值运算符逗号运算符高低算术运算符:*、/、%(高)+、-(低)关系运算符:>、<、>=、<=(高)==、!=(低)例
j=3;k=++j;//k=4,j=4;j=3;k=j++;//k=3,j=4;
a>b&&x>y等价于(a>b)&&(x>y)b+!a+c等价于b+(!a)+c二、常用运算符及其优先级别2024/1/158基础知识顺序结构、选择结构、循环结构选择结构的几种基本语句if(e)A;if(e)A;elseB;if(e1)A1;elseif(e2)A2;elseif(e3)A3;…elseAn;switch(e){casee1:A1;break;casee2:A2;break;…default:An;}三、程序的三种基本控制结构2024/1/159基础知识循环结构的几种基本语句:while(e)A;doA;while(e);for(e1;e2;e3)A;三、程序的三种基本控制结构2024/1/1510基础知识程序代码的录入,生成源程序*.c或*.cpp语法分析查错,翻译生成目标程序*.obj与其它目标程序或库链接装配,生成可执行程序*.exe编辑链接编译执行开始编辑编译有错?连接执行结果正确?结束有无可执行程序file.exe源程序file.c(file.cpp)目标程序file.obj库函数或其它目标程序不正确正确四、C++程序的开发流程2024/1/1511函数知识点函数的定义函数的参数和函数的值
函数的调用内置函数(内联函数)带缺省形参的函数函数的重载函数模板2024/1/1512函数C++程序是由一个一个的函数组成的函数的定义:形式参数表中必须指出每个变量的类型:函数类型
函数名([形参类型说明表]){ 函数体}intmax(intx,inty){intz;z=x>y?x:y;return(z);}intmax(intx,y){intz;z=x>y?x:y;return(z);}
一、函数的定义2024/1/1513函数形式参数与实际参数二、函数的参数和函数的值函数参数:用于函数间数据的传递形式参数:定义函数时使用的参数实际参数:调用函数时使用的参数函数的返回值函数的返回值即函数的值,是一确定的值。一个函数可以有多个return语句,但不论执行到哪个return,都将结束函数的调用而返回主调函数。return后面的括号可以省略,return后面可以是表达式。2024/1/1514函数调用形式三、函数的调用函数名(实参表);说明:如果是调用无参函数,则没有“实参表”,但括号不能省略;实参个数与形参个数一般是相同的,但如果有缺省值,则可以不相同;实参类型与形参类型最好相同,如果不相同,编译系统会进行数据类型转换;2024/1/1515函数函数调用在函数定义之前时,必须在函数调用前对该函数进行函数声明main(){floata=3.5,b=6.5,c;c=add(a,b);printf(“sumis%f",c);}floatadd(floatx,floaty){return(x+y);}
floatadd(floatx,floaty);
floatadd(float,float);三、函数的调用2024/1/1516函数函数的嵌套调用:在一个函数的函数体内又调用了另一个函数函数的递归调用:函数直接或间接的调用自身三、函数的调用2024/1/1517函数函数调用会增加执行的开销,C++中提供了内联函数,可以减少函数调用的开销;编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销;定义内联函数时,使用关键字inline。四、内联函数(内置函数)2024/1/1518函数函数在定义时可以预先定义出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先定义出的默认形参值。intadd(intx=5,inty=6){returnx+y;}voidmain(void){add(10,20);//10+20add(10);//10+6add();//5+6}五、带缺省形参的函数2024/1/1519函数C++允许功能相近的函数在相同的作用域内以相同函数名定义,从而形成重载。重载函数的形参列表必须不同:个数不同或类型不同。intadd(intx,inty);intadd(inta,intb);编译器不以形参名来区分intadd(intx,inty);voidadd(intx,inty);编译器不以返回值来区分形参类型不同intadd(intx,
inty);floatadd(floatx,floaty);形参个数不同intadd(intx,inty);intadd(intx,inty,intz);六、函数的重载2024/1/1520函数函数重载且具有缺省参数时,不能引起二义性:intfun(intx,chary);{……}intfun(intx=1,chary=‘a’,floatz=6.2);{……}fun(2,3);//产生了二义性六、函数的重载2024/1/1521函数函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,例,计算两个向量和的函数模板:#include<iostream.h>Template<classT>//模板声明,其中T为虚拟类型T*sum(T*a,T*b,intn){T*c=newT[n];
for(inti=0;i<n;i++)c[i]=a[i]+b[i];
retrunc;}七、函数模板2024/1/1522数组、指针、结构体数组是一种构造类型数据,它是按序排列的具有相同类型变量的集合。
inta[10];floatb[12];charc[20];#defineM10inti=15;intdata[M];
floatf[i];
charc(20);
数组名后只能用方括号括起来的正常量表达式(正常数或正符号常量)2024/1/1523数组、指针、结构体数组元素的下标从0开始,且不能越界(虽然下标越界不是语法错误)。一维数组如果不初始化,则自动赋随机值。可以只组前面部分元素赋初值,系统会自动给其它元素赋0,但所赋初值个数不能大于数组长度。inta[4]={1,2};↔inta[4]={1,2,0,0};inta[4]={1,2,3,4,5};
2024/1/1524数组、指针、结构体如果给一维数组的所有元素初始化,则可以不指定数组的长度,系统会自动根据初始化元素的个数确定数组长度。inta[]={1,2,3,4};对于二维数组,如果对所有元素赋初始,则必须指明第二维的长度,而不必指明第一维的长度。inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};2024/1/1525数组、指针、结构体指针变量是存放其它变量地址的变量。int*p1,*p2;指针有关的运算符:取地址运算符&:&x——得到变量x的地址(首地址)指针运算符*:*p——指针变量p所指向的内存单元2024/1/1526数组、指针、结构体结构体类型定义的一般形式为:struct结构体名{成员表列};struct
student{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};struct是关键字,表示是结构体类型,不可省略。student是一种数据类型,而不是一个变量,因此不分配内存。对各成员都应进行类型说明。结构体名和成员名命名规则与变量命名规则相同。结构体一个很典型的应用是链表,C语言中学过,2024/1/1527类与对象知识点两种程序设计方法的区别
类与对象的定义
构造函数与析构函数this关键字静态成员友元类模板常量成员2024/1/1528类与对象20世纪60年代,为了解决大型软件的开发中遇到的困难,人们提出了结构化编程(SP,StructuredProgramming)方法。随着计算机技术的发展,结构化编程方法的缺点也越来越明显。为此,提出了面向对象的编程(OOP,Object-OrientedProgramming
)方法。一、两种程序设计方法的区别2024/1/1529类与对象一、两种程序设计方法的区别结构化编程将数据和对数据的操作分离,程序由一个个的函数组成。面向对象的编程将数据和操作封装在一起,程序是由一个个对象组成的,对象之间通过接口进行通信,它能够较好地支持程序代码的复用。2024/1/1530类与对象一、两种程序设计方法的区别面向对象的编程方法的主要特点抽象:抽象的过程是将有关事物的共性归纳、集中的过程。封装:对一个对象进行封装,就是把它的一部分属性和功能对外界屏蔽,即从外界是看不到的,甚至是不可知的。继承:特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。多态性:指一个名字(或符号)具有多种含义。2024/1/1531类与对象class类名{private://(可省略)私有段变量和函数定义;protected:
保护段变量和函数定义;public:
公有段变量和函数定义;};(分号不可少)类定义的基本形式二、类与对象的定义2024/1/1532类与对象对象的定义:对象的引用:不能直接引用对象,只能引用其成员变量或成员函数。MyWatch.h=12;MyWatch.SetTime(0,0,0);YourWatch->h;(*YourWatch).SetTime(0,0,0);类类型名对象名;WatchMyWatch,*YourWatch;二、类与对象的定义2024/1/1533类与对象成员函数的函数体可以在类内部给出,也可以只在类内部声明函数,而在类外部写函数体,在类外写函数体时,必须注意格式。classWatch{private:inth,m,s;public:voidSetTime(inthh,intmm,intss)
{h=hh;m=mm;s=ss;}};classWatch{private:inth,m,s;public:voidSetTime(int,int,int);};voidWatch::SetTime(inthh,intmm,intss){
h=hh;m=mm;s=ss;}二、类与对象的定义2024/1/1534类与对象构造函数。构造函数是类的一个特殊的成员函数。构造函数名与类名相同。构造函数没有返回类型(与C不兼容)。构造函数可以有参数,可以重载。classWatch{private:
inth,m,s;public:
Watch();
Watch(int,int,int);};三、构造函数与析构函数2024/1/1535类与对象三、构造函数与析构函数构造函数。构造函数的参数可以是自己类对象的引用,此时称它为拷贝构造函数。拷贝构造函数的作用是将一个已存在的对象拷贝给新对象,若没有为类声明拷贝构造函数,则编译器自己生成一个缺省拷贝构造函数,缺省的拷贝构造函数只能将一个对象的数据成员拷贝给另一个对象,但对象中的指针所指向的内存不能拷贝,所以如果对象中有指针成员,则可能会出错。类名::类名(类名&引用名,…);2024/1/1536类与对象析构函数。析构函数是与构造函数对应的一种成员函数。析构函数没有返回类型,没有参数,函数名是类名前加”~”符号。析构函数不能重载。classWatch{private:inth,m,s;public:Watch();~Watch();};三、构造函数与析构函数2024/1/1537类与对象当创建类的一个新对象时,自动调用构造函数。当创建一个对象数组时,会自动调用多次构造函数,调用次数等于数组元素的个数。当一个对象的作用域结束时,系统会自动调用析构函数,用户也可以显示调用析构函数。当创建多个对象时,按对象创建的顺序调用构造函数,而析构函数的调用顺序正好相反。三、构造函数与析构函数2024/1/1538类与对象四、this关键字每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的,称为this指针this指针是指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址同一个类创建的多个对象共用同一份成员函数的拷贝,也知道是取哪一个对象的成员数据。this是一个隐含的指针,不能被显示声明,但可以使用。2024/1/1539类与对象五、静态成员类中的静态数据成员以static关键字说明。静态数据成员被所有对象共享,无论建立多少个该类的对象,都只有一个静态数据的存储空间。在该类对象被撤销时,静态成员并不撤销。静态数据成员若要初始化,只能在类定义之外进行。其形式为:类型类名::静态数据成员=初始值;2024/1/1540类与对象五、静态成员classX{public:
X(){a=1;}private:inta;
staticints=0;
};
classX{public:
X(){a=1;}private:inta;
staticints;
};intX::s=0;2024/1/1541类与对象一个对象的私有数据成员,只能通过成员函数进行访问。C++提供了一种辅助手段,允许外面的类或函数去访问一个类的私有数据,即友元关系。友元关系用friend关键字说明。一个类的友元函数可以在类的内部定义,也可以在类的外部定义,不管是哪种方式,友元函数都是类以外的函数,而不是成员函数。六、友员2024/1/1542类与对象classX{intx;public:inty;
friendvoidout(Xt);voidset(inta,intb){x=a;y=b;}};voidout(Xt){cout<<t.x<<endl;//正确:通过友元函数访问私有数据成员
cout<<t.y;//正确:类外能访问公有数据成员}main(){Xobj;obj.set(100,100)out(obj);}六、友员2024/1/1543类与对象七、类模板两个类所做的事完全相同,只是数据类型不同classCompare_int{public:Compare(inta,intb){x=a;y=b;}intmax(){return(x>y)?x:y;}intmin(){return(x<y)?x:y;}private:intx,y;};classCompare_float{public:Compare(floata,floatb){x=a;y=b;}floatmax(){return(x>y)?x:y;}floatmin(){return(x<y)?x:y;}private:floatx,y;};2024/1/1544类与对象七、类模板可以声明一个通用的类模板,它可以有一个或多个虚拟的类型参数,如对以上两个类可以综合写出以下的类模板:template<classnumtype>//声明类模板,虚拟类型numtypeclassCompare//类模板名为Compare{public:Compare(numtypea,numtypeb){x=a;y=b;}numtypemax(){return(x>y)?x:y;}numtypemin(){return(x<y)?x:y;}private:numtypex,y;};2024/1/1545在声明了一个类模板后,怎样使用它?怎样使它变成一个实际的类?先回顾一下用类来定义对象的方法:Compare_intcmp1(4,7);//Compare_int是已声明的类用类模板定义对象的方法与此相似,但是不能直接写成Comparecmp(4,7);//Compare是类模板名Compare是类模板名,而不是一个具体的类,类模板体中的类型numtype并不是一个实际的类型,只是一个虚拟的类型,无法用它去定义对象。必须用实际类型名去取代虚拟的类型,具体的做法是:Compare<int>cmp(4,7);//注意,要写成<int>,而不能写成(int),即Compare(int)cmp(4,7);是错误的2024/1/1546运算符重载运算符重载就是通过运算符重载函数,对原有的运算符的含义作出新的解释,而这种新含义只与重载该运算符的类有关。运算符重载只能对已有的运算符进行,而不能创造新的运算符。重载不能改变运算符的优先级。重载也不能改变运算符的结合律。重载不能改变运算符操作数的个数。2024/1/1547运算符重载C++中大部分运算符都可以被重载。+-*/%^&|~!=<>+=-=*=/=%=^=&=!=<<>>>>=<<===!=<=>=&&||++--->*‘->[]()newdeletenew[]delete[]少数C++运算符不能被重载。..*::?:sizeof2024/1/1548运算符重载运算符重载是通过一个运算符重载函数进行的运算符函数是成员函数typeClassName::operator@(参数表){//相对于该类而定义的操作}函数返回类型类名关键字被重载的运算符运算符函数是友元函数typeoperator@(参数表){//相对于该类而定义的操作}运算符函数名称成员函数重载和友元函数重载时,参数个数分别为n-1和n,其中为n为运算符的操作参数个数。C++是区分运算符前缀和后缀的,重载函数在参数上有些区别,即后缀形式多一个整数,2024/1/1549运算符重载重载<<和>>运算符输出(输入)运算符“<<”
(“>>”)的第一个操作数是cout
(cin),它实际上是标准类类型ostream
(istream)的对象的引用。为了保证“<<”
(“>>”)的连用性,重载函数的返回值应为ostream&
(
istream&)。2024/1/1550继承与派生知识点派生类的定义派生类的构成派生类成员的访问属性派生类的构造函数和析构函数基类与派生类的转换2024/1/1551继承与派生一、派生类的定义class派生类名:继承方式基类名{
派生类新增成员定义;};继承方式:公有继承(public)、私有继承(private)、受保护的继承(protected),默认为private2024/1/1552继承与派生二、派生类的构成派生类包含基类的所有数据成员和成员函数,而且还能有自己的区别于基类的特性。person类charname[10];intage;charsex;voidprint();student类charname[10];intage;charsex;voidprint();intnum;intscore[6];voidinput_score();2024/1/1553继承与派生三、派生类成员的访问属性公有继承(public):基类的公用成员和受保护成员在派生类中保持原有访问属性。私有继承(private):基类的公用成员和保护成员在派生类中成了私有成员。受保护的继承(protected):基类的公用成员和保护成员在派生类中成了保护成员。不论哪种派生方式,基类的私有成员都成为派生类的不可访问成员,但可以通过基类的公有成员函数访问。2024/1/1554继承与派生四、派生类的构造函数和析构函数在设计派生类的构造函数时,不仅要考虑派生类所增加的数据成员的初始化,还应当考虑基类的数据成员初始化。建立一个对象时,执行构造函数的顺序:①先调用基类构造函数;②再执行派生类构造函数。2024/1/1555继承与派生四、派生类的构造函数和析构函数类的数据成员中可以包含对象,该对象称为子对象派生类构造函数的任务应该包括3个部分:对基类数据成员初始化;对子对象数据成员初始化;对派生类数据成员初始化。执行派生类构造函数的顺序:调用基类构造函数,对基类数据成员初始化;调用子对象构造函数,对子对象数据成员初始化;再执行派生类构造函数本身,对派生类数据成员初始化。2024/1/1556继承与派生五、基类与派生类的转换在公有派生方式下,一个派生类的对象可以作为基类的对象使用(但基类对象不能作为派生类对象使用),具体有三种情况:派生类的对象直接赋给基类的对象;派生类对象向基类对象的引用赋值;派生类对象的地址赋给基类对象的指针;2024/1/1557继承与派生六、多重继承引起的二义性问题如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性。classB{public:intb;};classB1:publicB{private:intb1;};classB2:publicB{private:intb2;};classC:publicB1,publicB2{public:voidset();private:intd;};classC{set(),d}classB1{b1}classB2{b2}classB{b}classB{b}2024/1/1558继承与派生六、多重继承引起的二义性问题B对象的数据成员c.bB1对象的数据成员c.b1B对象的数据成员c.bB2对象的数据成员c.b2C对象自己的数据成员c.d类C的对象的数据成员c.bc.b1c.bc.b2c.dBBB1B2CvoidC::set(){
b=1;//错误访问b,二义性,B::b=1;//错误访问b,二义性
B1::b=1;B2::b=2;//正确访问b}解决这一问题的方法是使用虚基类概念2024/1/1559继承与派生六、多重继承引起的二义性问题为避免二义性,在继承间接共同基类时应只保留一份成员,需要采用虚基类的概念实现。用关键字virtual将B说明为B1和B2的虚基类,其中virtual与public位置可以对调。classB{public:intb;};classB1:virtualpublicB{private:intb1;};classB2:virtualpublicB{private:intb2;};classC:publicB1,publicB2{public:voidset();private:intd;};2024/1/1560继承与派生六、多重继承引起的二义性问题用virtual说明B为B1和B2的虚基类后,C类的对象中只有一个B类对象,该对象是在创建B1对象时创建的,当创建B2对象时,不会再创建B对象了。classC{d}classB1{b1}classB2{b2}classB{b}voidC::set(){b=1;//正确
B::b=1;//正确
B1::b=1;//正确
B2::b=1;//正确}B对象的数据成员c.bB1对象的数据成员c.b1B2对象的数据成员c.b2C对象自己的数据成员c.d类C的对象的数据成员2024/1/1561多态性与虚函数从系统实现的角度看,多态性分为两类:静态多态性和动态多态性。函数重载和运算符重载实现的多态性属于静态多态性,在程序编译时系统就能决定调用的是哪个函数,因此又称编译时的多态性。动态多态性是在程序运行过程中才动态地确定操作所针对的对象。它又称运行时的多态性。动态多态性是通过虚函数(virtualfunction)实现的。虚函数用关键字virtual说明。2024/1/1562例1:分析程序写结果#include<iostream.h>classA{public:A(){cout<<“A构造函数”<<endl;}A(A&objA){cout<<“A拷贝构造函数”<<endl;}};classB:publicA{public:
AobjA;
B(){cout<<“B构造函数”<<endl;}
B(B&objB){cout<<“B拷贝构造函数"<<endl;}};voidmain(){AobjA1,*objA3;AobjA2(objA1);BobjB1;BobjB2(objB1);}A构造函数A拷贝构造函数A构造函数B构造函数A构造函数B拷贝构造函数子对象:作为另一个类的数据成员的对象。这种情况下,先调用子对象的构造函数,然后调用本类的构造函数。2024/1/1563例2:分析
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能交通设施检测与评估协议2026
- 马术俱乐部赛事奖金分配协议2026
- 民宿设施设备租赁合同2026
- 视觉识别2026年委托协议
- 化妆品生产质量管理协议
- 线上数据标注兼职时间管理服务合同
- 肝细胞癌中PD - L1的表达特征、作用机制及临床意义研究
- 肝癌患者栓塞程度与血清血管内皮生长因子含量变化的相关性探究
- 肌酐-胱抑素C比值:肺癌化疗后骨髓抑制与肝脏毒性预测的新视角
- 聚硅氧烷纳米胶囊:靶向药物缓释的创新载体与应用探索
- 2022-2023年基础考核烟草专卖管理师二级题库完整版及答案
- 口腔科种植牙术后口腔护理指南
- 2025年电气类考试真题及答案
- 2025年pcr上岗证培训试题及答案
- 3-6岁儿童学习及发展指南社会领域测试题有答案
- 储能行业入门知识培训课件
- DB34∕T 4265-2022 综合能源供应服务站建设规范
- 大健康连锁店商业计划书
- 职业角色的转换课件
- 禁止纹身主题班会课件
- 井下煤矿爆破方案(3篇)
评论
0/150
提交评论