C复习资料中讲解.docx
- 文档编号:28600155
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:28
- 大小:57.25KB
C复习资料中讲解.docx
《C复习资料中讲解.docx》由会员分享,可在线阅读,更多相关《C复习资料中讲解.docx(28页珍藏版)》请在冰豆网上搜索。
C复习资料中讲解
C++复习题
一、类与对象
(一)知识要点
1. 掌握类与对象的概念和定义方法,掌握类成员的访问属性。
2. 掌握构造函数的概念、定义方法和使用方法。
3. 掌握析构函数的概念、定义方法和使用方法。
4. 掌握拷贝构造函数的概念、定义方法和使用方法。
5. 掌握包含对象成员的类构造函数的定义方法。
6. 掌握静态成员的概念、定义方法、作用和特点。
7. 掌握友元的概念、定义方法、作用和特点。
(二)思考题
题1:
下列有关类的说法不正确的是()。
A. 对象是类的一个实例
B. 任何一个对象只能属于一个具体的类
C. 一个类只能有一个对象
D.类与对象的关系和数据类型与变量的关系相似
题2:
下面()项是对构造函数和析构函数的正确定义。
A.voidX:
:
X(),voidX:
:
~X()
B.X:
:
X(参数),X:
:
~X()
C.X:
:
X(参数),X:
:
~X(参数)
D.voidX:
:
X(参数),voidX:
:
~X(参数)
题3:
()的功能是对对象进行初始化。
A.析构函数B.数据成员C.构造函数D.静态成员函数
题4:
下列表达方式正确的是()。
A.classP{B.classP{
public:
public:
intx=15;intx;
voidshow(){cout< };} C.classP{D.classP{ intf;public: };inta; f=25;voidSeta(intx){a=x;}}; 题5: 拷贝构造函数具有的下列特点中,()是错误的。 A. 如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的 B. 拷贝构造函数只有一个参数,并且是该类对象的引用 C. 拷贝构造函数是一种成员函数 D.拷贝构造函数的名字不能用类名 题6: 关于静态成员的描述中,()是错误的。 A. 静态成员可分为静态数据成员和静态成员函数 B. 静态数据成员定义后必须在类体内进行初始化 C. 静态数据成员初始化不使用其构造函数 D. 静态成员函数中不能直接引用非静态成员 题7: 关于友元的描述中,()是错误的。 A. 友元函数是成员函数,它被说明在类体内 B. 友元函数可直接访问类中的私有成员 C. 友元函数破坏封装性,使用时尽量少用 题8: 设有如下程序结构: classBox {…}; voidmain() {BoxA,B,C;} 该程序运行时调用次构造函数;调用次析构函数。 题9: 设A为test类的对象且赋有初值,则语句testB(A);表示。 题10: 利用“对象名.成员变量”形式访问的对象成员仅限于被声明为的成员;若要访问其他成员变量,需要通过函数或函数。 题11: 分析找出以下程序中的错误,说明错误原因,给出修改方案使之能正确运行。 #include classone {inta1,a2; public: one(intx1=0,x2=0); }; voidmain() {onedata(2,3); cout< cout< } 题12: 分析以下程序的错误原因,给出修改方案使之能正确运行。 #include classAmplifier{ floatinvol,outvol; public: Amplifier(floatvin,floatvout) {invol=vin;outvol=vout;} floatgain(); }; Amplifier: : floatgain(){returnoutvol/invol;} voidmain() {Amplifieramp(5.0,10.0); cout<<"\n\nThegainis=>"< } 题13: 下列程序的运行结果是。 #include classpoint {intx,y; public: point(inta,intb) {x=a;y=b; cout<<"callingtheconstructorfunction."< } point(point&p); friendpointmove(pointq); ~point(){cout<<"callingthedestructorfunction.\n";} intgetx(){returnx;} intgety(){returny;} }; point: : point(point&p) {x=p.x;y=p.y; cout<<"callingthecopy_initializationconstructorfunction.\n"; } pointmove(pointq) {cout<<"OK! \n"; inti,j; i=q.x+10; j=q.y+20; pointr(i,j); returnr; } voidmain() {pointm(15,40),p(0,0); pointn(m); p=move(n); cout<<"p="< } 题14: 定义一个学生类,其中有3个数据成员: 学号、姓名、年龄,以及若干成员函数。 同时编写main函数使用这个类,实现对学生数据的赋值和输出。 题15: 计算两点之间的距离。 二、继承与派生 (一)知识要点 1. 掌握继承和派生的定义,派生类的定义方法。 (1)掌握继承的两种类型: 单继承和多继承。 (2)掌握private,public,protected三种继承方式的特点。 继承方式决定了基类中的成员在派生类中的属性。 三种继承方式的共同点: 基类的private成员在派生类中不可见。 区别: 对于私有继承,基类的public、protected成员在派生类中作为private成员;对于公有继承,基类的public、protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。 (3)掌握派生类中的构造函数和析构函数的使用。 基类的构造函数和析构函数不能继承,所以必要时在派生类中定义自己的构造函数和析构函数。 派生列的构造函数完成基类中新增数据成员和基类数据成员的初始化,基类数据成员的初始化通过基类构造函数来实现。 (4)掌握派生类的同名覆盖规则。 (5)掌握赋值兼容规则。 基类对象可以使用公有派生类对象来代替,包括: 派生类对象可以赋值给基类对象;派生类对象可以初始化基类对象的引用;基类类型指针可以指向派生类对象。 2. 掌握多重继承的概念、定义方法、多重继承派生类构造函数的执行顺序。 派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类时指定的各基类顺序),在执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。 3. 掌握虚基类的概念和定义方法。 在多重继承中,如果多条继承路径上有一个公共的基类,则在这些路径的汇合点上的派生类会产生来自不同路径的公共基类的多个拷贝,如果用virtual把公共基类定义成虚基类,则只会保留公共基类的一个拷贝。 (二)思考题 题1: 下列对派生类的描述中,()是错误的。 A. 一个派生类可以作为另一个派生类的基类 B. 派生类至少有一个基类 C. 派生类的成员除了它自己的成员外,还包含了它的基类成员 D.派生类中继承的基类成员的访问权限到派生类保持不变 题2: 派生类的对象对它的哪一类基类成员是可以访问的? () A.公有继承的基类的公有成员B.公有继承的基类的保护成员 C.公有继承的基类的私有成员D.保护继承的基类的公有成员 题3: 关于多继承二义性的描述,()是错误的。 A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性 B. 一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性 C. 解决二义性最常用的方法是作用域运算符对成员进行限定 D. 派生类和它的基类中出现同名函数时,将可能出现二义性 题4: 多继承派生类构造函数构造对象时,()被最先调用。 A.派生类自己的构造函数B.虚基类的构造函数 C.非虚基类的构造函数 D.派生类中子对象类的构造函数 题5: C++类体系中,能被派生类继承的是()。 A.构造函数B.虚函数C.析构函数D.友元函数 题6: 设有基类定义: classCbase {private: inta; protected: intb; public: intc; }; 派生类采用何种继承方式可以使成员变量b成为自己的私有成员() A.私有继承B.保护继承 C.公有继承D.私有、保护、公有均可 题7: C++将类继承分为和两种。 题8: 派生类可以定义其_______________中不具备的数据和操作。 题9: 派生类构造函数的初始化列表中包含____________________________。 题10: 在继承机制下,当对象消亡时,编译系统先执行的析构函数,然后才执行的析构函数,最后执行的析构函数。 题11: 设有以下类的定义: classAclassB: protectedAclassC: privateB {intA1;{intb1;{intc1; protected: intA2;protected: intb2;protected: intc2; public: intA3;public: intb3;public: intc3; };};}; 请按访问权限写出派生类C中具有的成员。 私有成员: 保护成员: 公有成员: 。 题12: 指出并改正下面程序中的错误。 #include classPoint {intx,y; public: Point(inta=0,intb=0){x=a;y=b;} voidmove(intxoffset,intyoffset){x+=xoffset;y+=yoffset;} intgetx(){returnx;} intgety(){returny;} }; classRectangle: protectedPoint {intlength,width; public: Rectangle(intx,inty,intl,intw): Point(x,y) {length=l;width=w;} intgetlength(){returnlength;} intgetwidth(){returnwidth;} }; voidmain() {Rectangler(0,0,8,4); r.move(23,56); cout< < } 题13: 指出并改正下面程序中的错误。 #include classA {public: intx; A(inta=0){x=a;} voiddisplay(){cout<<"A.x="< }; classB {public: intx; B(inta=0){x=a;} voiddisplay(){cout<<"B.x="< }; classC: publicA,publicB {inty; public: C(inta,intb,intc): A(a),B(b) {y=c;} intgety(){returny;} }; voidmain() {Cmyc(1,2,3); myc.x=10; myc.display(); } 题14: 看程序写结果 #include classBase {inti; public: Base(intn){cout<<"Constuctingbaseclass"< ~Base(){cout<<"Destructingbaseclass"< voidshowi(){cout< intGeti(){returni;} }; classDerived: publicBase {intj; Baseaa; public: Derived(intn,intm,intp): Base(m),aa(p){ cout<<"Constructingderivedclass"< j=n; } ~Derived(){cout<<"Destructingderivedclass"< voidshow(){Base: : showi(); cout< }; voidmain() {Derivedobj(8,13,24); obj.show(); } 题15: 看程序写结果 #include classA {public: A(char*s){cout< ~A(){} }; classB: virtualpublicA {public: B(char*s1,char*s2): A(s1) {cout< }; classC: virtualpublicA { public: C(char*s1,char*s2): A(s1) { cout< } }; classD: publicB,publicC { public: D(char*s1,char*s2,char*s3,char*s4): B(s1,s2),C(s1,s3),A(s1) { cout< } }; voidmain() { D*p=newD("classA","classB","classC","classD"); deletep; } 题16: 建立一个基类Building,用来存储一座楼房的层数、房间数以及它的总平方英尺数。 建立派生类Housing,继承Building,并存储下面的内容: 卧室和浴室的数量,另外,建立派生类Office,继承Building,并存储灭火器和电话的数目。 然后,编制应用程序,建立住宅楼对象和办公楼对象,并输出它们的有关数据。 程序代码: #include classBuilding {public: Building(intf,intr,doubleft) {floors=f; rooms=r; footage=ft; } voidshow() {cout<<"floors: "< cout<<"rooms: "< cout<<"totalarea: "< } protected: intfloors; introoms; doublefootage; }; classHousing: publicBuilding {public: Housing(intf,intr,doubleft,intbd,intbth): Building(f,r,ft) {bedrooms=bd; bathrooms=bth; } voidshow() {cout<<"\nHOUSING: \n"; Building: : show(); cout<<"bedrooms: "< cout<<"bathrooms: "< } private: intbedrooms; intbathrooms; }; classOffice: publicBuilding { public: Office(intf,intr,doubleft,intph,intex): Building(f,r,ft) {phones=ph; extinguishers=ex; } voidshow() {cout<<"\nHOUSING: \n"; Building: : show(); cout<<"phones: "< cout<<"extinguishers: "< } private: intphones; intextinguishers; }; voidmain() {Housinghob(5,7,140,2,2); Officeoob(8,12,500,12,2); hob.show(); oob.show(); } 三、多态性 (一)知识要点 1.多态性: 多态是指同样的消息被不同类型的对象接收后导致完全不同的行为。 2.面向对象的多态性可以分为4类: 重载多态、强制多态、包含多态和参数多态。 3.多态从实现的角度来讲可以划分为两类: 编译时的多态和运行时的多态。 4.运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据导致不同类型的行为。 5.运算符重载的规则如下: 1)C++语言中的运算符除了少数几个之外,全部可以重载,而且只能重载C++语言中已有的运算符。 2)重载之后运算符的优先级和结合性都不会改变。 3)运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。 一般来讲,重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。 不能重载的运算符只有5个,它们是类属关系运算符“.”、成员指针运算符“*”、作用域分辨符“: : ”、sizeof运算符和三目运算符“? : ”。 前面两个运算符保证了C++语言中访问成员功能的含义不被改变。 作用域分辨符和sizeof运算符的操作数是类型,而不是普通的表达式,也不具备重载的特征。 6.运算符的重载形式有两种,重载为类的成员函数和重载为类的友元函数。 运算符重载为类的成员函数的一般语法形式为: 函数类型operater运算符(形参表) {函数体;} 运算符重载为类的友元函数的一般语法形式为: friend函数类型operater运算符(形参表) {函数体;} 7.虚函数 说明虚函数的一般格式如下: virtual <函数返回类型说明符> <函数名>(<参数表>) 在定义虚函数时要注意: (1)虚函数是非静态的、非内联的成员函数,而不能是友元函数,但虚函数可以在另一个类中被声明为友元函数。 (2)虚函数声明只能出现在类定义的函数原型声明中,而不能在成员函数的函数体实现的时候声明。 (3)一个虚函数无论被公有继承多少次,它仍然保持其虚函数的特性。 (4)若类中一个成员函数被说明为虚函数,则该成员函数在派生类中可能有不同的实现。 当使用该成员函数操作指针或引用所标识的对象时,对该成员函数调用可采用动态联编。 (5)定义了虚函数后,程序中声明的指向基类的指针就可以指向其派生类。 在执行过程中,该函数可以不断改变它所指向的对象,调用不同版本的成员函数,而且这些动作都是在运行时动态实现的。 虚函数充分体现了面向对象程序设计的动态多态性。 8.虚析构函数 在析构函数前加上关键字virtual进行说明,则该析构函数就称为虚析构函数。 虚析构函数的说明格式如下: virtual ~<类名>() 在使用虚析构函数时要注意以下几点: (1)只要基类的析构函数被声明为虚函数,则派生类的析构函数,无论是否使用virtual关键字进行声明,都自动成为虚函数。 (2)如果基类的析构函数为虚函数,则当派生类未定义析构函数时,编译器所生成的析构函数也为虚函数; (3)当使用delete运算符删除一个对象时,隐含着对析构函数的一次调用,如果析构函数为虚函数,则这个调用采用动态联编。 动态联编可以保证析构函数被正确执行。 (4)子类型化要求析构函数应被声明为虚函数,特别是在析构函数完成一些有意义的工作时。 因此,当不能决定是否应将析构函数声明为虚函数时,就将析构函数声明为虚函数。 9.纯虚函数 当在基类中不能为虚函数给出一个有意义的实现时,可以将其声明为纯虚函数,其实现留待派生类完成。 纯虚函数的作用是为派生类提供一个一致的接口。 纯虚函数的声明格式如下: virtual <函数返回类型说明符> <函数名>(<参数表>)=0; 10.抽象类 带有纯虚函数的类称为抽象类。 抽象类具有下述一些特点: (1)抽象类只能作为基类使用,其纯虚函数的实现由派生类给出;但派生类仍可不给出纯虚函数的定义,继续作为抽象类存在。 (2)抽象类不能定义对象,一般将该类的构造函数说明为保护的访问控制权限。 (3)可以声明一个抽象类的指针和引用。 通过指针和引用,可以指向并访问派生类对象,进而访问派生类的成员,这种访问是具有多态特征的。 (二)思考题 题1: 指出下列对定义重载函数的要求中,哪些是错误的提法。 A. 要求参数的个数不同。 B.要求参数中至少有一个类型不同。 C. 求函数的返回值不同。 D.要求参数的个数相同时,参数类型不同。 题2: 下列运算符中,()运算符在C
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 复习资料中讲解 复习资料 讲解