《C复习习题部分实用.pptx》由会员分享,可在线阅读,更多相关《C复习习题部分实用.pptx(65页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 练习2#include void main()cinx;int p=x*x;cout“p=”p“n”;1)变量必须先声明后使用;2)cout输出字符串时用双引号(“”)括起;int x;第第2页页/共共65页页第1页/共65页 练习3#include void main()int i,j;i=5;int k=i+j;cout“i+j=”k“n”;v没有确定值的变量不能引用!j=1;第第3页页/共共65页页第2页/共65页#include void main()int a,b,c;a=5;b=8;c=max(a,b);coutmax(a,b)=cy?x:y;写出输出结果第第2章章第第4页页/共
2、共65页页第3页/共65页有以下程序段int a10=1,2,3,4,5,6,7,8,9,10,*p=&a3,b;b=p5;b中的值是()A)5 B)6 C)8 D)9练习第第5页页/共共65页页第4页/共65页 “指针”通过地址间接访问某个变量;“引用”通过别名直接访问某个变量;比较 例2.5 分析程序输出结果#include void main()int val(5);int&refv=val;/int&refv(val)错 /引用定义时初始化 refv=refv+5;/对引用操作 coutvalendl;int *p=&refv,val1(refv);/取引用的地址值 cout*ptva
3、l1=3或者或者x=3 or x=3|x=3|x=3|x2)等价的表达式是等价的表达式是_。4表达式于语句的重要区别是表达式于语句的重要区别是_。5x*=y+8等价于等价于x=_。112.5 x=2 x*(y+8)(略略)第第9页页/共共65页页第8页/共65页#include /文件包含命令#define A 10 /宏定义命令 void main()#if A0 /条件编译命令 cout0”endl;#elif A0 cout“a0”endl;#else cout“a=0”endl;#endif 输出结果:a0第第3章章第第10页页/共共65页页第9页/共65页#include#defin
4、e PI 3.14159 void main()double r,l,s;coutr;l=2*PI*r;s=PI*r*r;cout“l=”lendl;cout“s=”sendl;void main()double r,l,s;coutr;l=2*3.14159*r;s=3.14159*r*r;cout“l=”lendl;cout“s=”sendl;宏替换第第11页页/共共65页页第10页/共65页#includevoid main()int b(5);#define b 2#define f(x)b*(x)int y(3);coutf(y+1)endl;/宏替换2*(y+1)#undef b
5、coutf(y+1)endl;/变量b*(y+1)#define b 3 coutf(y+1)endl;/宏替换3*(y+1)82012第第12页页/共共65页页第11页/共65页习题1从下面的选项中选出正确的答案在宏定义:#define MAXINT 324中,宏名MAXINT代替的是:a.实型数b.整型数c.常量d.一串字符2分析下列叙述是正确的:a.在带参的宏定义中,形式参数是变量。b.在带参的宏定义中,形式参数是变量。c.宏替换不占用运行时间。d.在带参的宏定义中,要定义其形式参数的类型。3一个C+程序开始执行的位置是:a.程序开头b.预编译c.main函数d.以上答案都不正确4下列叙
6、述正确的是:a 一个程序中可以有多个#include命令行b 在#include命令行中,用双引号和用尖括号将被包含的文件名括起来没有区别c#include命令行只能放在程序开始位置d#include命令后也必须以分号结束第第13页页/共共65页页第12页/共65页习题5.预处理命令在程序中都是以以下哪个符号开头的。a.*b.#c.:d./6 文件包含中被包含的文件的扩展名。a.必须为.h b.不能用.hc.必须是.cd.不一定是.h7带参数的宏定义中,程序中引用宏定义的参数是。a.只能是常量b.只能是整型量c.只能是整型表达式d.可以是任意表达式8在宏定义define PI 3.141592
7、6中,用宏名PI代替是一个。a.单精度数b.双精度数c.常量d.字符串第第14页页/共共65页页第13页/共65页习题_写出下面程序的输出结果#include#define CIR(r)r*rvoid main()int x=1;int y=2;int z;z=CIR(x+y);coutzendl;#include#define TESTvoid main()int x=0;int y=1;int z=1;#ifdef TESTcoutxy;#endifcoutz;5011第第15页页/共共65页页第14页/共65页下列程序执行时输入下列程序执行时输入5,给出运行结果。,给出运行结果。#inc
8、lude#define N-2void main()int n;cinn;#if N0cout1endl;#elsecout-1endl;#endif#ifdef EOFcoutEOFendl;#endif-1-1第第16页页/共共65页页第15页/共65页#include#include f1.cppvoid main()int a(5),b;b=f1(a);coutbendl;#define M(m)m*mint f1(int x)int a(3);return -M(x+a);f1.cpp文件内容如下:宏替换:-x+a*x+a -5+3*5+313第第17页页/共共65页页第16页/共6
9、5页#include void main()int a,b;a=b=5;if(a=1)if(b=5)a+=b;coutaendl;else a-=b;coutaendl;couta+bendl;if体内嵌套10第第18页页/共共65页页第17页/共65页两个浮点数的四则运算#includevoid main()float d1,d2;char op;coutd1opd2;switch(op)float temp;case+:temp=d1+d2;coutd1opd2=tempendl;break;case-:temp=d1-d2;coutd1opd2=tempendl;break;case*:
10、temp=d1*d2;coutd1opd2=tempendl;break;case/:temp=d1/d2;coutd1opd2=tempendl;break;default:couterror!n;Input d1 op d2:4.0*5.24.0*5.2 =20.8第第19页页/共共65页页第18页/共65页下列do-while循环的循环次数为()已知:int i(5);do couti-endl;i-;while(i!=0);A.0;B.1;C.10;D.无限第第20页页/共共65页页第19页/共65页1 如果变量如果变量x,y已经正确定义,已经正确定义,下列语句哪一项不能正确将下列语句
11、哪一项不能正确将x,y的值进行交换:的值进行交换:a.x=x+y,y=x-y,x=x-y;b.t=x,x=y;y=t;c.t=y,y=x,x=t;d.x=t,t=y,y=x2 如要求在如要求在if后一对括号中后一对括号中的表达式,表示的表达式,表示a不等于不等于0的时的时候的值为候的值为真真,则能正确表,则能正确表示这一关系的表达式为:示这一关系的表达式为:a.a0b.!ac.a=0d.a3 下面的这个循环的循环次下面的这个循环的循环次数是:数是:for(int i=0,j=10;i=j=10;i+,j-)a.无限次无限次b.语法错误,不能执行语法错误,不能执行c.10d.14下列下列do-w
12、hile循环的循环循环的循环次数是:次数是:for(int i=0,x=0;!x&i=5;i+)a.5b.6c.1d.无限次无限次第第21页页/共共65页页第20页/共65页看下面几个循环语句,说明循环的含义看下面几个循环语句,说明循环的含义1、while(c=getchar()!=Y&c!=y&c!=N&c!=n);2、while(thue).3、while(i).4、int i=1,sum=0;while(i=100)sum+=i+;接受键盘输入,直到输入的是Y,y,N,n为止。死循环 当i为0时,结束循环 求1+2+3+100的和 第第22页页/共共65页页第21页/共65页#inclu
13、devoid main()int x(5);do switch(x%2)case 1:x-;break;case 0:x+;break;x-;coutx0);4332110-1-15%2=13%2=11%2=1第第23页页/共共65页页第22页/共65页#includevoid main()int a(5),b(6),i(0),j(0);switch(a)case 5:switch(b)case 5:i+;break;case 6:j+;break;default:i+;j+;case 6:i+;j+;break;default:i+;j+;couti,jendl;1,2第第24页页/共共65
14、页页第23页/共65页#include void fun(int a=1,int b=3,int c=5)couta=a,b=b,c=cendl;void main()fun();fun(7);fun(7,9);fun(7,9,11);a=1,b=3,c=5a=7,b=3,c=5a=7,b=9,c=5a=7,b=9,c=11默认值函数定义第第4章章第第25页页/共共65页页第24页/共65页#includevoid main()int a(5),b(7),c(10);couta b cendl;int b(8);float c(8.8);couta b cendl;a=b;int c=b;co
15、uta b cendl;couta b cendl;couta b cendl;5 7 105 8 8.88 8 88 8 8.88 7 10第第26页页/共共65页页第25页/共65页1)以下说法错误的是:)以下说法错误的是:a.全局变量就是在函数外定义的变量,因此又叫做外全局变量就是在函数外定义的变量,因此又叫做外部变量部变量b.一个函数中既可以使用本函数中的局部变量,也可一个函数中既可以使用本函数中的局部变量,也可以使用全局变量以使用全局变量c.局部变量的定义和全局变量的定义的含义不同局部变量的定义和全局变量的定义的含义不同d.如果在同一个源文件中,全局变量和局部变量同名,如果在同一个源
16、文件中,全局变量和局部变量同名,则在局部变量的作用范围内,全局变量通常不起作用则在局部变量的作用范围内,全局变量通常不起作用2)当一个函数无返回值时,定义它的函数类型应是当一个函数无返回值时,定义它的函数类型应是。a.voidb.intc.任意任意d.无无第第27页页/共共65页页第26页/共65页3 C+语言中函数返回值的类型是由语言中函数返回值的类型是由_决定的?决定的?a.return语句中的表达式类型语句中的表达式类型b.调用该函数的主调函数类型调用该函数的主调函数类型c.定义函数时所指定的函数类型定义函数时所指定的函数类型d.以上说法都不正确以上说法都不正确4在一个源文件中定义的全局
17、变量的作用域为:在一个源文件中定义的全局变量的作用域为:a.本程序的全部范围本程序的全部范围b.本函数的全部范围本函数的全部范围c.从定义该变量的位置开始到本文件结束从定义该变量的位置开始到本文件结束d.以上说法都不正确以上说法都不正确第第28页页/共共65页页第27页/共65页5以下对于以下对于C+语言的描述中,正确的是:语言的描述中,正确的是:a.C+语言中调用函数时,值传递方式只能将实参的值传语言中调用函数时,值传递方式只能将实参的值传递给形参,形参的值不能传递给实参递给形参,形参的值不能传递给实参b.C+语言中函数既可以嵌套定义,也可以递归调用语言中函数既可以嵌套定义,也可以递归调用c
18、.函数必须有返回值函数必须有返回值d.C+程序中有调用关系的所有函数必须放在同一源程序程序中有调用关系的所有函数必须放在同一源程序文件中文件中6一个一个C+语言程序总是从语言程序总是从_开始执行:开始执行:a.主程序主程序b.子程序子程序c.主函数主函数d.第一个函数第一个函数第第29页页/共共65页页第28页/共65页7下列叙述中正确的是:下列叙述中正确的是:a.C+语言程序中,语言程序中,main()函数必须在其它函数之前,函数必须在其它函数之前,函数内可以嵌套定义函数函数内可以嵌套定义函数b.C+语言程序中,语言程序中,main()函数的位置没有限制,函函数的位置没有限制,函数内不可以嵌
19、套定义函数数内不可以嵌套定义函数c.C+语言程序中,语言程序中,main()函数必须在其它函数之前,函数必须在其它函数之前,函数内不可以嵌套定义函数函数内不可以嵌套定义函数d.C+语言程序中,语言程序中,main()函数必须在其它函数之后,函数必须在其它函数之后,函数内可以嵌套定义函数函数内可以嵌套定义函数第第30页页/共共65页页第29页/共65页#includevoid f(int j);void main()for(int i(1);i=4;i+)f(i);void f(int j)static int a(10);/内部静态类变量 int b(1);/自动类变量 b+;couta+b+
20、j=a+b+jendl;a+=10;习题习题110+2+1=1320+2+2=2430+2+3=3540+2+4=46第第31页页/共共65页页第30页/共65页传址调用传址调用#includevoid fun(int,int,int*);void main()int x,y,z;fun(5,6,&x);fun(7,x,&y);fun(x,y,&z);coutx,y,zendl;void fun(int a,int b,int*c)b=b+a;*c=b-a;666实参:地址形参:指针习题习题2第第32页页/共共65页页第31页/共65页函数参数的默认值函数参数的默认值#includeint a
21、dd(int x,int y=8);void main()int a(5);coutsum1=add(a)endl;coutsum2=add(a,add(a)endl;coutsum3=add(a,add(a,add(a)endl;int add(int x,int y)return x+y;sum1=13sum2=18sum3=23函数声明习题习题3第第33页页/共共65页页第32页/共65页函数重载函数重载#includevoid ff(int),ff(double);void main()float a(88.18);ff(a);char b(a);ff(b);void ff(doubl
22、e x)coutff(double):xendl;void ff(int x)coutff(int):xendl;ff(double):88.18ff(int):97习题习题3第第34页页/共共65页页第33页/共65页#include#includetdate1.hvoid main()TDate1 today(1998,4,6),tomorrow(1998,4,7);couttoday is ;today.Print();couttomorrow is ;tomorrow.Print();TDate1:TDate1(int y,int m,int d)year=y;month=m;day=
23、d;coutConstructor called.n;TDate1:TDate1()coutDestructor called.n;Constructor Called.Constructor Called.today is 1998-4-6tomorrow is 1998-4-7 Destructor Called.Destructor Called.思考:析构函数调用的顺序?思考:析构函数调用的顺序?第第6章章第第35页页/共共65页页第34页/共65页TDate1:TDate1()/析构函数 coutyear“-month“-day“Destructor.n;1998-4-6 Const
24、ructor.1998-4-7 Constructor.today is 1998-4-6tomorrow is 1998-4-7 1998-4-7 Destructor.1998-4-6 Destructor.TDate1:TDate1(int y,int m,int d)/构造函数 year=y;month=m;day=d;coutyear-month-dayConstructor.n;析构函数的调用顺序与构造函数的调用顺序相反!第第36页页/共共65页页第35页/共65页三、设置参数的缺省值class N public:N(int a=3,int b=5,int c=7);/构造函数缺省
25、值 int Aout()return A;int Bout()return B;int Cout()return C;private:int A,B,C;N:N(int a,int b,int c)A=a;B=b;C=c;v一般成员函数和构造函数都可以设置参数缺省值一般成员函数和构造函数都可以设置参数缺省值例:例:第第37页页/共共65页页第36页/共65页#includevoid main()N X,Y(9,11),Z(13,15,17);coutX=X.Aout(),X.Bout(),X.Cout();coutendl;coutY=Y.Aout(),Y.Bout(),Y.Cout();co
26、utendl;coutZ=Z.Aout(),Z.Bout(),Z.Cout();coutendl;class N public:N(int a=3,int b=5,int c=7);;X=3,5,7 Y=9,11,7 Z=13,15,17第第38页页/共共65页页第37页/共65页例:void main()Point p1(3.0,4.0),p2(6.0,8.0);p1.Getxy();p2.Getxy();/成员函数调用 double d=Distance(p1,p2);/友元函数调用 coutDistance is dendl;(3.0,4.0)(6.0,8.0)Distance is 5
27、void Point:Getxy()cout(x,y)endl;double Distance(Point&a,Point&b)double dx=a.x-b.x;double dy=a.y-b.y;return sqrt(dx*dx+dy*dy);友元函数,类外的普通函数访问类中私有数据成员成员函数调用方式和普通函数的调用方式一样第第39页页/共共65页页第38页/共65页1在下列关键字中,用于说明类中公有成员的是a.publicb.privatec.protectedd.friend2下列的各函数中,_不是类的成员函数a.构造函数b.析构函数c.友元函数d.拷贝构造函数第第40页页/共共6
28、5页页第39页/共65页3_不是构造函数的特征。a.构造函数的函数名与类名相同b.构造函数可以重载c.构造函数可以设置缺省参数d.构造函数必须指定类型说明4_是析构函数的特征。a.一个类中只能定义一个析构函数b.析构函数在对象创建时调用c.析构函数的定义只能在类体内d.析构函数可以有一个或多个参数第第41页页/共共65页页第40页/共65页5关于成员函数特征的下述描述中,_是错误的。a成员函数一定是内联函数b成员函数可以重载c成员函数可以设置参数的缺省值d成员函数可以是静态的6如果编程者没有显式定义构造函数(包括复制构造函数),C+编译器就_。a.出现编译错误b.没有构造函数c.必须显示定义d
29、.隐式定义缺省的构造函数 第第42页页/共共65页页第41页/共65页7静态成员函数仅能访问_。a.静态的数据成员b.非静态的成员函数c.非静态的数据成员d.以上都不对8静态数据成员的初始化必须在_。a.类内b.类外c.在构造函数内d.静态成员函数内9友元作用_。a.提高程序的运用效率b.加强类的封装性c.实现数据的隐藏性d.增加成员函数的种类第第43页页/共共65页页第42页/共65页例例1#include class A public:A();A(int i,int j);void print();private:int a,b;A:A()a=b=0;coutDefault constru
30、ctor.n;A:A(int i,int j)a=i;b=j;coutConstructor calledn;void A:print()couta=a,b=bendl;void main()A m,n(4,8);m.print();n.print();Default constructor.Constructor called.a=0,b=0 a=4,b=8构造函数的重载构造函数的重载第第44页页/共共65页页第43页/共65页例2#include class B public:B()B(int i,int j);void printb();private:int a,b;class A p
31、ublic:A();A(int i,int j);void printa();private:B c;/子对象;void main()A m(7,9);m.printa();a=7,b=9A:A(int i,int j):c(i,j)c(i,j)/成员初始化表 void A:printa()c.printb();B:B(int i,int j)a=i;b=j;void B:printb()couta=a,b=bendl;第第45页页/共共65页页第44页/共65页例3 静态成员静态成员#include class Count public:Count()count+;static int HM
32、()return count;Count()count-;private:static int count;void main()Count c1,c2,c3,c4;coutCount:HM()endl;104int Count:count=100;第第46页页/共共65页页第45页/共65页例4 友元函数友元函数1035789.504#include class Apublic:A(double t,double r)Total=t;Rate=r;friend double Count(A&a);private:double Total,Rate;void main()A a1(1000.0
33、,0.035),a2(768.0,0.028);coutCount(a1),Count(a2)endl;double Count(A&a)a.Total+=a.Rate*a.Total;return a.Total;友元函数定义第第47页页/共共65页页第46页/共65页例 12void main()K k1(8),k2(17);int s=add(k1,k2);/实参:对象 coutsendl;25class K public:K(int i)k=i;int setk()const return k;private:int k;int add(const K&g1,const K&g2)in
34、t sum=g1.setk()+g2.setk();return sum;常引用作函数参数常成员函数第第48页页/共共65页页第47页/共65页void main()int *p,*q,a=5;p=new int(10);q=&a;cout*pendl;cout*qendl;delete p;delete q;v使用使用delete运算符时运算符时注意事项:注意事项:只能用于new 返回的指针或空指针,不能用于其他指针!第第49页页/共共65页页第48页/共65页void main()int *p,a=5;p=new int(10);cout*pendl;delete p;p=&a;cout*
35、pprint();a2-print();delete a1;delete a2;Default Constructor.Constructor.0,0 5,6Destructor.Destructor.void AA:print()coutA,Bendl;class AA public:AA()A=B=0;cout“Default Constructor.n;AA(int i,int j)A=i;B=j;coutConstructor.n;AA()coutDestructor.n;void print();private:int A,B;第第51页页/共共65页页第50页/共65页1.继承方式
36、?继承方式?2.A:f?4.改为改为class B:public A?5.改为改为class B:protected A?class A public:void f(int i)coutiendl;void g()coutgn;class B:A public:void h()couthn;A:f;void main()B d1;/d1是派生类B的对象 d1.f(6);d1.g();/访问基类A公有成员 d1.h();6h6gh3.哪个语句有错误?哪个语句有错误?去掉该语句后运行结果:去掉该语句后运行结果:将将A类中的公有成员说明为类中的公有成员说明为B类中类中的公有成员的公有成员私有私有错误
37、错误第第7章章第第52页页/共共65页页第51页/共65页class Apublic:A()a=0;cout“As default constructor called.n;A(int i)a=i;cout“As constructor called.n;private:int a;class B:public Apublic:B()b=0;cout“Bs default constructor called.n”;B(int i,int j,int k):A(i),aa(j)b=k;coutBs constructor called.n”;private:int b;A aa;/子对象;基类
38、构造函数子对象类构造函数隐式调用基类A和子对象aa的缺省构造函数第第53页页/共共65页页第52页/共65页#includeclass B1public:B1(int i)b1=i;coutConstructor B1.iendl;private:int b1;class B2public:B2(int i)b2=i;coutConstructor B2.iendl;private:int b2;class B3public:B3(int i)b3=i;coutConstructor B3.iendl;private:int b3;例例-多重继承多重继承第第54页页/共共65页页第53页/共6
39、5页class A:public B1,public B2public:A(int i,int j,int k,int l):B1(i),B2(j),bb(k)a=l;coutContructor A.lendl;private:int a;B3 bb;/子对象子对象;void main()A aa(5,6,7,4);第第55页页/共共65页页第54页/共65页1.类类A继承类继承类B,则,则A称为称为B的的 ,B称为称为A的的 。2.一个派生类继承多个基类称为一个派生类继承多个基类称为 。3.三种继承访问说明符是:三种继承访问说明符是:、,如果基类的公有函数到继承类中,如果基类的公有函数到继
40、承类中仍是公有函数,应该使用仍是公有函数,应该使用 继承方式。继承方式。4.派生类中对基类的成员函数派生类中对基类的成员函数f进行覆盖,如果调进行覆盖,如果调用基类的成员用基类的成员f应该使用应该使用 。习习 题题派生类 基类 多继承多继承 public private protected public 域运算符 第第56页页/共共65页页第55页/共65页5创建派生类对象时,先调用基类的构造函数,再调用派创建派生类对象时,先调用基类的构造函数,再调用派生类的构造函数,生类的构造函数,6当销毁这个对象时,先调用派生类的析构函数,再调用当销毁这个对象时,先调用派生类的析构函数,再调用基类的析构函
41、数。基类的析构函数。7无论什么方式的继承,基类的私有成员都不能被派生类无论什么方式的继承,基类的私有成员都不能被派生类访问。访问。对对对对对对第第57页页/共共65页页第56页/共65页例例:动态联编动态联编运行结果运行结果:375void fun(Point&s)couts.Area()endl;class Pointpublic:Point(double i,double j)x=i;y=j;virtual double Area()const return 0.0;private:double x,y;class Rectangle:public Pointpublic:Rectangl
42、e(double i,double j,double k,double l):Point(i,j)w=k;h=l;virtual double Area()const return w*h;private:double w,h;void main()Rectangle rec(3.0,5.2,15.0,25.0);fun(rec);引用运行时,fun()函数的对象引用s 被动态联编,束定到Rectangle 类的Area()函数不同类体中,说明完全相同的函数有不同的实现第第8章章第第58页页/共共65页页第57页/共65页2.静态联编静态联编,编译时警告信息编译时警告信息:Warning:ar
43、gument:conversion from const double to int运行结果:运行结果:1.派生类中虚函数派生类中虚函数print与与基类虚函数参数类型不同,基类虚函数参数类型不同,不能实现动态联编。不能实现动态联编。3.改为:改为:print(int x,int y),可以实现动态联编。可以实现动态联编。运行结果运行结果:class Apublic:virtual void print(int x,int y)coutA:print x,yendl;A:print 3,8A:print 6,5B:print 3,8B:print 6,5class B:public Apubl
44、ic:virtual void print(int x,float y)coutB:print x,yendl;void show(A&a)a.print(3,8);a.print(6,5.9);void main()B b;show(b);例例-通过成员函数调用虚函数通过成员函数调用虚函数第第59页页/共共65页页第58页/共65页void main()C c;c.g();A:f()called.C:f()called.例例-构造函数和析构函数中调用虚函数构造函数和析构函数中调用虚函数class C:public Bpublic:C();virtual void f()coutC:f()ca
45、lled.n;class Apublic:A()virtual void f()coutA:f()called.n;class B:public Apublic:B()f();/构造函数中调用虚函数构造函数中调用虚函数 /virtual void f()coutB:f()called.n;void g()f();/成员函数中调用虚函数成员函数中调用虚函数;静态联编动态联编运行结果?运行结果?第第60页页/共共65页页第59页/共65页#include class CPolygon protected:int width,height;public:void set_values(int a,i
46、nt b)width=a;height=b;virtual int area(void)=0;class CRectangle:public CPolygonpublic:int area(void)return(width*height);class CTriangle:public CPolygonpublic:int area(void)return(width*height/2);int main()CRectangle rect;CTriangle trgl;CPolygon*ppoly1=▭CPolygon*ppoly2=&trgl;ppoly1-set_values(4
47、,5);ppoly2-set_values(4,5);cout area()endl;cout area()endl;return 0;2010第第61页页/共共65页页第60页/共65页1.多态也称为多态也称为 或或 ,在,在C中是通过中是通过 实实现的。现的。2.通过在虚函数参数表后加通过在虚函数参数表后加 ,我们可以定义纯虚函数。,我们可以定义纯虚函数。含有纯虚函数的类我们称为含有纯虚函数的类我们称为 。3.在在C+中,构造函数和析构函数,中,构造函数和析构函数,不能定义为虚函数,不能定义为虚函数,可以定义为虚函数。可以定义为虚函数。4.要达到动态联编的效果,基类和派生类的对应函数不仅名
48、字相要达到动态联编的效果,基类和派生类的对应函数不仅名字相同,而且返回类型、参数同,而且返回类型、参数 和和 也必须相同。也必须相同。5.C+编译器不允许用抽象类创造对象,它只能被其它类编译器不允许用抽象类创造对象,它只能被其它类 。习题:习题:动态联编动态联编 迟后联编迟后联编 虚函数虚函数=0 抽象类抽象类构造函数构造函数 析构函数析构函数 个数个数 类型类型 继承继承 第第62页页/共共65页页第61页/共65页1.基类中定义了虚函数,在派生类中相应函数会自动变成虚函数。基类中定义了虚函数,在派生类中相应函数会自动变成虚函数。2.要达到动态联编的效果,基类和派生类的对应函数不仅名字相同,
49、要达到动态联编的效果,基类和派生类的对应函数不仅名字相同,而且返回类型、参数个数和类型也必须相同。而且返回类型、参数个数和类型也必须相同。3.如果派生类没有实现虚函数,那么它将使用他的基类的虚函数。如果派生类没有实现虚函数,那么它将使用他的基类的虚函数。4.如果抽象类的虚函数在基类中被实现,我们就可以用它创建对象。如果抽象类的虚函数在基类中被实现,我们就可以用它创建对象。5.我们不能用抽象类定义对象,但可以定义对象的指针。我们不能用抽象类定义对象,但可以定义对象的指针。6.构造函数和析构函数可以是虚函数。构造函数和析构函数可以是虚函数。7.虚析构函数的工作过程与普通虚函数不同,普通虚函数只是调
50、用虚析构函数的工作过程与普通虚函数不同,普通虚函数只是调用相应层上的函数,而虚析构函数是先调用相应层上的析构函数,相应层上的函数,而虚析构函数是先调用相应层上的析构函数,然后逐层向上调用基类的析构函数。然后逐层向上调用基类的析构函数。习题:习题:对对对对对对错错对对错错对对第第63页页/共共65页页第62页/共65页1.在输入输出流类中预定义的,与标准设备相连的四个全局对象是()()()()2.如果在程序中使用IO流库,应包含头文件()3.操纵算子()向输出流中插入换行符并刷新缓冲区4.在文件操作结束时,可以用 成员函数()关闭该文件。cin cout cerr clog Iostream.h