1-1简述计算机程序设计语言的发展历程。
解:
迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C++语
言是一种面向对象的编程语言,也属于高级语言。
1-2面向对象的编程语言有哪些特点
面向对象的编程语言与以往各种编程语言有根本的不同,它设计的出发点就是为了能更直接
的描述客观世界中存在的事物以及它们之间的关系。面向对象的编程语言将客观事物看作具
有属性和行为的对象,通过抽象找出同一类对象的共同属性(静态特征)和行为(动态特征),
形成类。通过类的继承与多态可以很方便地实现代码重用,大大缩短了软件开发周期,并使
得软件风格统一。因此,面向对象的编程语言使程序能够比较直接地反问题域的本来面目,
软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。C++语言是目
前应用最广的面向对象的编程语言。
1-3什么是结构化程序设计方法这种方法有哪些优点和缺点
结构化程序设计的思路是:自顶向下、逐步求精;其程序结构是按功能划分为若干个基本模
块;各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和
循环三种基本结构组成;其模块化实现的具体方法是使用子程序。结构化程序设计由于采用
了模块分解与功能抽象,自顶向下、分而治之的方法,从而有效地将一个较复杂的程序系统
设计任务分解成许多易于控制和处理的子任务,便于开发和维护。
虽然结构化程序设计方法具有很多的优点,但它仍是一种面向过程的程序设计方法,它把数
进行相应的修改,每一种相对于老问题的新方法都要带来额外的开销,程序的可重用性差。
由于图形用户界面的应用,程序运行由顺序运行演变为事件驱动,使得软件使用起来越来越
方便,但开发起来却越来越困难,对这种软件的功能很难用过程来描述和实现,使用面向过
程的方法来开发和维护都将非常困难。
1-4什么是对象什么是面向对象方法这种方法有哪些特点
从一般意义上讲,对象是现实世界中一个实际存在的事物,它可以是有形的,也可以是无形
的。对象是构成世界的一个独立单位,它具有自己的静态特征和动态特征。面向对象方法中
的对象,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位,由一
组属性和一组行为构成。
面向对象的方法将数据及对数据的操作方法放在一起,作为一个相互依存、不可分离的整体
一对象。对同类型对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行
处理。类通过一个简单的外部接口,与外界发生关系,对象与对象之间通过消息进行通讯。
这样,程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。
通过实现继承与多态性,还可以大大提高程序的可重用性,使得软件的开发和维护都更为方
便。
面向对象方法所强调的基本原则,就是直接面对客观存在的事物来进行软件开发,将人们在
日常生活中习惯的思维方式和表达方式应用在软件开发中,使软件开发从过分专业化的方
法、规则和技巧中回到客观世界,回到人们通常的思维。
1-5什么叫做封装
封装是面向对象方法的一个重要原则,就是把对象的属性和服务结合成一个独立的系统单
位,并尽可能隐蔽对象的内部细节。
1-6面向对象的软件工程包括哪些主要内容
面向对象的软件工程是面向对象方法在软件工程领域的全面应用,它包括面向对象的分析
(00A)、面向对象的设计(00D)、面向对象的编程(OOP)、面向对象的测试(00T)和面向
对象的软件维护(OOSM)等主要内容。
1-7简述计算机内部的信息可分为几类
计算机内部的信息可以分成控制信息和数据信息二大类;控制信息可分为指令和控制字两
类;数据信息可分为数值信息和非数值信息两类。
1-8什么叫二进制使用二进制有何优点和缺点
二进制是基数为2,每位的权是以2为底的寨的进制,遵循逢二进一原则,基本符号为0
和1。采用二进制码表示信息,有如下几个优点:1.易于物理实现;2.二进制数运算简单;
3.机器可靠性高;4.通用性强。其缺点是它表示数的容量较小,表示同一个数,二进制较其
他进制需要更多的位数。
1-9请将以下十进制数值转换为二进制和十六进制补码:
(1)2(2)9(3)93
(4)-32(5)65535(6)-1
(1)(2)10=(10)2=(2)16
(2)(9)10=(1001)2=(9)16
(3)(93)10=(1011101)2=(5D)16
(4)(-32)10=()2=(E0)16
(5)(65535)10=()2=(FFFF)16
(6)(-1)10=()2=(FFFF)16
1-10请将以下数值转换为十进制:
次
(1)(1010)2(2)()2(3)(01011111)2
(4)(7F)16(5)(2D3E)16(6)(F10E)16
(1)(1010)2=(10)10
(2)()2=(143)10
(3)(01011111)2=(24515)10
(4)(7F)16=(127)10
(5)(2D3E)16=(11582)10
(6)(F10E)16=(61710)10
1-11简要比较原码、反码、补码等几种编码方法。
原码:将符号位数字化为0或1,数的绝对值与符号一起编码,即所谓"符号——绝对值表
示"的编码。
正数的反码和补码与原码表示相同。
负数的反码与原码有如下关系:
符号位相同(仍用1表示),其余各位取反(0变1,1变0)。
补码由该数反码的最末位加1求得。
第二章C++简单程序设计
2-1C++语言有那些主要特点和优点
C++语言的主要特点表现在两个方面,一是全面兼容C,二是支持面向对象的方法。C++是一
个更好的C,它保持了C的简洁、高效、接近汇编语言、具有良好的可读性和可移植性等特
点,对C的类型系统进行了改革和扩充,因此C++比C更安全,C++的编译系统能检查出更
多的类型错误。C++语言最重要的特点是支持面向对象。
2-2下列标识符哪些是合法的
Program,,_lock,test2,3inl,mail,A_B_C_D
Program,_lock,test2,A_B_C_D是合法的标识符,其它的不是。
>
2-3例中每条语句的作用是什么
#include<>
voidmain(void)
(
cout',Hello!\nM;
cout< } #include<>201/4 2.201%4 3.201/ 1.50 2.1 3. 2-10执行完下列语句后,a、b、c三个变量的值为多少 a=30; b=a++; c=++a; a:32;b:30;c:32; 2-11在一个for循环中,可以初始化多个变量吗如何实现 在for循环设置条件的第一个";"前,用,分隔不同的赋值表达式。 ] 例如: for(x=0,y=10;x<100;x++,y++) 2-12执行完下列语句后,n的值为多少 intn; for(n=0;n<100;n++) n的值为100 2-13写一条for语句,计数条件为n从].00到200,步长为2;然后用while和do…while 语句完成同样的循环。 for循环: for(intn=100;n<=200;n+=2); while循环: intx=100; while(n<=200) n+=2; do…while循环: intn=100; do ( }while(n<=200); 2-14if(x=3)和if(x==3)这两条语句的差别是什么 语句if(x=3)把3赋给x,赋值表达式的值为true,作为if语句的条件;语句if(x=3) 首先判断x的值是否为3,若相等条件表达式的值为ture,否则为false。 2-15什么叫做作用域什么叫做局部变量什么叫做全局变量,如何使用全局变量 作用域是一个标识符在程序正文中有效的区域。局部变量,一般来讲就是具有块作用域的变 量;全局变量,就是具有文件作用域的变量。 2-16已知x、y两个变量,写一条简单的if语句,把较小的的值赋给原本值较大的变量。 if(x>y) x=y; elsen”; cout"Thesizeofashortintis:\t"< cout”Thesizeofalongintis:\tH< cout”Thesizeofacharis:\t\tHsizeof(char)”bytes.\nM; cout<<°Thesizeofafloatis:\t\tM< cout°Thesizeofadoubleis:\twsizeof(double)<<"bytes.\nH; return0; ) 程序运行输出: Thesizeofanintis:4bytes. Thesizeofashortintis:2bytes. Thesizeofalongintis:4bytes. Thesizeofacharis:1bytes. Thesizeofafloatis:4bytes. Thesizeofadoubleis:8bytes. 2-20打印ASCII码为32~127的字符。 解: ttinclude<> intmain() for(inti=32;i<128;i++) cout(char)i; 程序运行输出: !n#$%G'()*+,./09:;<>@ABCDEFGHIJKLMNOP_QRSTUVWXYZ[\]'abcdefghijklmnopqrstuvwxy z<|>~s 2-21运行下面的程序,观察其输出,与你的设想是否相同 unsignedintx; unsignedinty=100; unsignedintz=50; x=y-z; cout"Differenceis:"< x=z-y; coutH\nNowdifferenceis:”xendl; Differenceis:50 Nowdifferenceis:46 注意,第二行的输出并非-50,注意x、y、z的数据类型。 2-22运行下面的程序,观察其输出,体会i++与++i的差别。 intmyAge=39;n"; cout<<"Youare:"< myAge++;.\n”; cout"Iam:"myAge"yearsold.\n"; cout"Youare:"< cout< cout°Iam:"myAge++"yearsold.\n,r; cout<<"Youare:"++yourAge<<"yearsold\nn; cout"Let'sprintitagain.\nH; cout"Iam:"myAge"yearsold.\n'r; cout<<"Youare:"< Iam39yearsold Youare39yearsold Oneyearpasses Iam40yearsold Youare40yearsold Anotheryearpasses Youare41yearsold Let'sprintitagain Iam41yearsold 2-23什么叫常量什么叫变量 所谓常量是指在程序运行的整个过程中其值始终不可改变的量,除了用文字表示常量外,也 可以为常量命名,这就是符号常量;在程序的执行过程中其值可以变化的量称为变量,变量 是需要用名字来标识的。 2-24变量有哪几种存储类型 变量有以下几种存储类型: auto存储类型:采用堆栈方式分配内存空间,属于一时性存储,其存储空间可以被若干变 量多次覆盖使用; register存储类型:存放在通用寄存器中; extern存储类型:在所有函数和程序段中都可引用; static存储类型:在内存中是以固定地址存放的,在整个程序运行期间都有效。 2-25写出下列表达式的值: 1.2<3&&6<9 2.!(4<7) 3.!(3>5)||(6<2) 1.true 2.false 3.true 2-26若a=1,b=2,c=3,下列各式的结果是什么 1.aIb-c 2.ab&-c 3.a&b|c 4.a|b&c $ 1.-1 3.3 4.3 2-27若a=1,下列各式的结果是什么 1.!a|a 2.~a|a ¥ 3.aa 4.a2 1.1 2.-1 3.0 4.0 2-28编写一个完整的程序,实现功能:向用户提问"现在正在下雨吗",提示用户输入Y或 N若输入为Y,显示"现在正在下雨。若输入为N,显示"现在没有下雨。否则继续 提问"现在正在下雨吗" 源程序: voidniain() charflag; while(l) cout<<"现在正在下雨吗(YesorNo):M; cin>>flag; if(toupper(flag)二二'Y,) cout<〈"现在正在下雨。 break; if(toupper(flag)='N') cout<<"现在没有下雨。"; 现在正在下雨吗(YesNo):x 现在正在下雨吗(YesorNo):l 现在正在下雨吗(YesNo):q 现在正在下雨吗(YesorNo):n 现在没有下雨。 或: 现在正在下雨吗(YesNo):y 现在正在下雨。 2-29编写一个完整的程序,运行时向用户提问"你考试考了多少分(0100)\接收输入后 判断其等级,显示出来。规则如下: voidmain() inti,score; cout”你考试考了多少分(O'lOO):"; cinscore; if(score>100||score<0) cout<<"分数值必须在。到100之间! else i=score/10; switch(i) case10: case9: cout<<"你的成绩为优! case8: cout<<"你的成绩为良!”; case7: case6: cout"你的成绩为中!"; default: cout<<"你的成绩为差!"; 你考试考了多少分(0~100):85 你的成绩为良! 2-30(1)实现一个简单的菜单程序,运行时显示"Menu:A(dd)D(elete)S(ort)Q(uit), Selectone:”提示用户输入,A表示增加,D表示删除,S表示排序,Q表示退出,输入为A、 D、S时分别提示”数据已经增加、删除、排序。”输入为Q时程序结束。要求使用if-else 语句进行判断,用break、continue控制程序流程。 voidmain() charchoice,c; while(1) { cout"Menu:A(dd)D(elete)S(ort)Q(uit),Selectone: cin>>c; choice=toupper(c); if(choice=='A*) cout"数据已经增加."< continue; elseif(choice=='D') cout<〈"数据已经删除."< elseif(choice='S') cout"数据已经排序."< elseif(choice=='Q') Menu:A(dd)D(elete)S(ort)Q(uit),Selectone:a 数据已经增加. Menu:A(dd)D(elete)S(ort)Q(uit),Selectone:d 数据已经删除. Menu:A(dd)D(elete)S(ort)Q(uit),Selectone:s 数据已经排序. Menu:A(dd)D(elete)S(ort)Q(uit),Selectone:q (2)实现一个简单的菜单程序,运行时显示"Menu:A(dd)D(elete)S(ort)Q(uit),Select one:"提示用户输入,A表示增加,D表示删除,S表示排序,Q表示退出,输入为A、D、S 时分别提示”数据已经增加、删除、排序。”输入为Q时程序结束。要求使用Switch语句。 源程序: charchoice; cout<<"Menu:A(dd)D(elete)S(ort)Q(uit),Selectone: cinchoice; switch(toupper(choice)) case'A': cout<<"数据已经增加."< case'Dr: cout<<"数据已经删除."< case'Sr: cout<<"数据已经排序."< case'Q': exit(0); 2-31用穷举法找出l~100间的质数,显示出来。分别使用while,do-while,for循环语句 实现。 使用while循环语句: inti,j,k,flag; i二2; whiled<=100) flag=1; k=sqrt(i); J=2; while(j<=k) if(i%j==0) flag=0; j++; j if(flag) couti<〈"是质数."< i++; 使用do…while循环语句: i=2; do{ do( }while(j<=k); cout< }while(i<=100); 使用for循环语句: for(i=2;i<=100;i++) for(j=2;j<=k;j++) couti<<"是质数,"endl; 2是质数. 3是质数. 5是质数. 7是质数. 11是质数. 13是质数. 17是质数. 19是质数. 23是质数. 29是质数. 31是质数. 37是质数. 41是质数. 43是质数. 47是质数. 53是质数. 59是质数. 61是质数. 67是质数. 71是质数. 73是质数. 79是质数. 83是质数. 89是质数. 97是质数. 2-32比较Break语句与Continue语句的不同用法。 Break使程序从循环体和switch语句内跳出,继续执行逻辑上的下一条语句,不能用在别 处; continue语句结束本次循环,接着开始判断决定是否继续执行下一次循环; 入年、月、日、小时、分、秒的值,然后完整地显示出来。 源程序见"实验指导"部分实验二 2-34在程序中定义一个整型变量,赋以1~100的值,要求用户猜这个数,比较两个数的大 小,把结果提示给用户,直到猜对为止。分别使用while、do…while语句实现循环。 nNumberone:"; cin>>one; cout"Numbertwo:"; cin>>two; answer=Divider(one,two); if(answer>-1) cout"Answer:"< cout<<"Error,can'tdividebyzero!"; s Entertwonumbers. Numberone:8 Numbertwo:2 Answer:4 3-8编写函数把华氏温度转换为摄氏温度,公式为:C=(F-32)*5/9;在主程序中提示 用户输入一个华氏温度,转化后输出相应的摄氏温度。 源程序见"实验指导"部分实验三 3-9编写函数判断一个数是否是质数,在主程序中实现输入、输出。 intprime(inti);endl; couti<<"不是质数."< intprime(inti) intj,k,flag; return1; 请输入一个整数:1151 1151是质数. 3-10编写函数求两个整数的最大公约数和最小公倍数。 ^include<> intfnl(inti,intj);n"; (7); (20); cout”NowJackis”; cout()<<"yearsoldand”; cout<<()<<"poundsweight.,r; JackisaDogwhois2yearsoldand10poundsweight. NowJackis7yearsold20poundsweight. 4-9设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐 标,能计算矩形的面积。 classRectangle public: Rectangle(inttop,intleft,intbottom,intright); ^Rectangle(){} * intGetTopOconst{returnitsTop;} intGetLeft()const{returnitsLeft;} intGetBottomOconst{returnitsBottom;) intGetRight()const{returnitsRight;} voidSetTop(inttop){itsTop=top;} voidSetLeft(intleft){itsLeft二left;} voidSetBottom(intbottom){itsBottom=bottom;} voidSetRight(intright){itsRight=right;} intGetArea()const; private: intitsTop; intitsLeft; intitsBottom; intitsRight; ); Rectangle::Rectangle(inttop,intleft,intbottom,intright) itsTop=top; itsLeft=left; itsBottom=bottom; itsRight=right; intRectangle::GetArea()const intWidth二itsRight-itsLeft; intHeight=itsTop-itsBottom; return(Width*Height); RectangleMyRectangle(100,20,50,80); intArea=(); cout<<"Area:n< Area:3000 UpperLeftXCoordinate:20 4-10设计一个用于人事管理的People(人员)类。考虑到通用性,这里只抽象出所有类型 人员都具有的属性:number(编号)、sex(性别)、birthday(出生日期)、id(身份证号) 等等。其中“出生日期”定义为一个“日期”类内嵌子对象。用成员函数实现对人员信息的录入 和显示。要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、带缺省形参值的 成员函数、聚集。 本题用作实验四的选做题,因此不给出答案。 4-11定义一个矩形类,有长、宽两个属性,有成员函数计算矩形的面积 Rectangle(floatlen,floatwidth) Length=len; Width=width; ^Rectangle(){}; floatGetAreaO{returnLength*Width;} floatGetLengthO{returnLength;} floatGetWidthO{returnWidth;} floatLength; floatWidth; floatlength,width; cout"请输入矩形的长度:"; cinlength; cout”请输入矩形的宽度:"; cin>>width; Rectangler(length,width); cout<<"长为"length<<"宽为"< ()endl; Y 请输入矩形的长度:5 请输入矩形的宽度:4 长为5宽为4的矩形的面积为:20 4-12定义一个“数据类型“datatype类,能处理包含字符型、整型、浮点型三种类型的数 据,给出其构造函数。 classdatatype( enum{ character, integer, floating_point }vartype; union charc; inti; floatf; }; public: datatype(charch){ vartype=character; c=ch; datatype(intii){ vartype二integer; i=ii; datatype(floatff){ vartype=floating_point; f=ff; voidprint(); voiddatatype::print(){ switch(vartype){ casecharacter: cout<<"字符型:”《cendl; caseinteger: cout"整型:Mi< casefloating_point: cout"浮点型:"< voidmain(){ datatypeA('c'),B(12),C; 0; 字符型:c 整型:12 浮点型: 4-13定义一个Circle类,有数据成员半径Radius,成员函数GetAreaO,计算圆的面积, 构造一个Circle的对象进行测试。 classCircle Circle(floatradius){Radius=radius;} "Circle(){} floatGetArea(){return*Radius*Radius;} floatRadius; floatradius; cout<〈”请输入圆的半径:”; cin>>radius; Circlep(radius); cout<<"半径为"< endl; 请输入圆的半径:5 半径为5的圆的面积为: 4-14定义一个tree类,有成员ages,成员函数grow(intyears)对ages加上ycars,age() 显示tree对象的ages的值。 classTree{ intages; Tree(intn=0); "TreeO; voidgrow(intyears); voidage(); Tree::Tree(intn){ ages=n; Tree::"TreeO{ age(); voidTree::grow(intyears){ ages+=years; voidTree::age(){ cout<<"这棵树的年龄为"< < Treet(12); (4); 这棵树的年龄为12 这棵树的年龄为16 第五章C++程序的基本结构 5-1什么叫做作用域有哪几种类型的作用域 作用域讨论的是标识符的有效范围,作用域是一个标识符在程序正文中有效的区域。C++的 作用域分为函数原形作用域、块作用域(局部作用域)、类作用域和文件作用域. 5-2什么叫做可见性可见性的一般规则是什么 可见性是标识符是否可以引用的问题; 标识符则外层标识符不可见。 5-3下面的程序的运行结果是什么,实际运行一下,看看与你的设想有何不同。 voidmyFunctionO; intx=5,y=7; cout<<"xfrommain:"x<<"\n"; cout"yfrommain:"y"\n\n"; myFunctionO; cout<<"BackfrommyFunction!\n\nn; cout"xfrommain:"x"\n"; cout”yfrommain:"y"\n"; voidmyFunctionO inty=10; cout”xfrommyFunction:"x"\rT; cout<<"yfrommyFunction:"< xfrommain:5 yfrommain:7 xfrommyFunction:5 yfrommyFunction:10 BackfrommyFunction! 5-4假设有两个无关系的类Engine和Fuel,使用时,怎样允许Fuel成员访问Engine中的 私有和保护的成员 classfuel; classengine friendclassfuel; private; intpowerlevel; public; engine(){powerLevel=0;} voidengine_fn(fuel&f); classfuel friendclassengine; intfuelLevel; fuel(){fuelLevel=0;} voidfuel_fn(engine&e); ): 5-5什么叫做静态数据成员它有何特点 数据成员,每一个类的对象都拥有一个拷贝,就是说每个对象的同名数据成员可以分别存储 不同的数值,这也是保证对象拥有自身区别于其它对象的特征的需要,但是静态数据成员, 每个类只要一个拷贝,由所有该类的对象共同维护和使用,这个共同维护、使用也就实现了 同一类的不同对象之间的数据共享。 % 5-6什么叫做静态函数成员它有何特点 对象共同维护,为这些对象所共享。静态函数成员具有以下两个方面的好处,一是由于静态 成员函数只能直接访问同一个类的静态数据成员,可以保证不会对该类的其余数据成员造成 负面影响;二是同一个类只维护一个静态函数成员的拷贝,节约了系统的开销,提高程序的 运行效率。 5-7定义一个Cat类,拥有静态数据成员HowManyCats,记录Cat的个体数目;静态成员函 数GetHowMany(),存取HowManyCats。设计程序测试这个类,体会静态数据成员和静态成 员函数的用法。 classCat Cat(intage):itsAge(age){HowManyCats++;} virtual~Cat(){HowManyCats—;} virtualintGetAge(){returnitsAge;} virtualvoidSetAge(intage){itsAge=age;} staticintGetHowMany(){returnHowManyCats;} intitsAge; staticintHowManyCats; intCat::HowManyCats=0; voidTelepathicFunctionO; constintMaxCats=5; Cat*CatHouse[MaxCats];inti; for(i=0;i CatHouseti]=newCat(i); TelepathicFunction(); deleteCatHouse[i]; voidTelepathicFunction() cout"Thereare"Cat::GetHowMany()"catsalive!\nM; Thereare1catsalive! Thereare2catsalive! Thereare3catsalive! Thereare4catsalive! Thereare5catsalive! Thoreare0catsalive! 5-8什么叫做友元函数什么叫做友元类 5-9如果类A是类B的友元,类B是类C的友元,类D是类A的派生类,那么类B是类A 的友元吗类C是类A的友元吗类D是类B的友元吗 类B不是类A的友元,友元关系不具有交换性; 类C不是类A的友元,友元关系不具有传递性; 类D不是类B的友元,友元关系不能被继承。 可以,例如: staticinta; 5-11在一个文件中定义一个全局变量n,主函数main。,在另一个文件中定义函数fnl(), 在main。中对n赋值,再调用fnl(),在fnl()中也对n赋值,显示n最后的值。 #include n=20; fnl(); cout"n的值为"< .\ntt;} myColoritsColor; Mammal::Mammal(): itsAge(l), itsWeight(5) cout°Mammalconstructor...\n,f; Mammal::^Mammal() coutHMammaldestructor...\nn; Dog::Dog():itsColor(WHITE) cout°Dogconstructor...\nM; Dog::"Dog() cout<<"Dogdestructor...\nn; DogJack; cout<<"Jackis"<<()<<"yearsold\n,r; Mammalconstructor... Dogconstructor... Mammalsound! Tailwagging... Fidois1yearsold Dogdestructor... Mammaldestructor... 7-7定义一个基类,构造其派生类,在构造函数中输出提示信息,观察构造函数的执行情况。 classBaseClass i BaseClass(); BaseClass::BaseClass() cout<<"构造基类对象!"< classDerivedClass:publicBaseClass DerivedClass(); DerivedClass::DerivedClass0 cout<<"构造派生类对象!"endl; DerivedClassd; 构造基类对象! 构造派生类对象! 7-8定义一个Document类,有name成员变量,从Document派生出Book类,增加PageCount 变量。 classDocument Document(){}; Document(char*name); char*Name;voidPrintNameOf0;}; Document::Document(char*name) Name=newchartstrlen(name)+1]; strcpy(Name,name); voidDocument::PrintNameOf0 coutNameendl; classBook:publicDocument Book(char*name,longpagecount); voidPrintNameOf(); longPageCount; Book::Book(char*name,longpagecount):Document(name) PageCount=pagecount; voidBook::PrintNameOf() cout"Nameofbook:"; Document::PrintNameOf(); Documenta('rDocumentl'*); Bookb("Book1”,100); 0; Nameofbook:Bookl 7-9定义基类Base,有两个共有成员函数fnl()、fn2(),私有派生出Derived类,如果想 在Derived类的对象中使用基类函数fnl(),应怎么办 classBase intfnl()const{return1;) intfn2()const{return2;} classDerived:privateBase intfnl(){returnBase::fnl();}; intfn2(){returnBase::fn20;}; Deriveda; 7-10定义object类,有weight属性及相应的操作函数,由此派生出box类,增加Height classobject intWeight; object() cout"构造object对象"endl; Weight=0; intGetWeight(){returnWeight;) voidSetWeight(intn){Weight=n;} "object(){cout"析构object对象"endl;) classbox:publicobject private: intHeight,Width; box() cout"构造box对象"endl; Height=Width=0; intGetHeight(){returnHeight;) voidSetHeight(intn){Height=n;} intGetWidthO{returnWidth;) voidSetWidth(intn){Width=n;} "box(){cout"析构box对象"< boxa; 构造object对象 构造box对象 析构box对象 析构object对象 7-11定义一个基类BaseClass,从它派生出类DerivedClass,BaseClass有成员函数fnl()、 fn2(),DerivedClass也有成员函数fnl()、fn2(),在主程序中定义一个DerivedClass的 对象,分别用DerivedClass的对象以及BaseClass和DerivedClass的指针来调用fnl()、 fn2(),观察运行结果。 voidfnl(); voidfn2(); voidBaseClass::fnl() cout<〈"调用基类的函数fnl()"< voidBaseClass::fn2() cout"调用基类的函数fn2()"endl; voidDerivedClass::fnl() cout<〈"调用派生类的函数fnl()"< voidDerivedClass::fn2() cout<<"调用派生类的函数fn2()"< DerivedClassaDerivedClass; DerivedClass*pDerivedClass=&aDerivedClass; BaseClass*pBaseClass=&aDerivedClass; pBaseClass->fnl(); pBaseClass->fn2(); pDerivedClass->fnl(); pDerivedClass->fn2(); 调用派生类的函数fnl() 调用派生类的函数fn2() 调用基类的函数fnl() 调用基类的函数fn2() 然后修改例9-1的程序,加入以下内容: 程序: 1.在程序首部加上文件包含命令 2.在框架窗口类之前加入从CDialog类派生的对话框类: etValue(name,point,height, color,escapement); m_nCount++; Invalidate0; howSignal(&dc); etValue(name,point,height,color, escapement); Invalidate(); etValue(name,point,m_colorSignal, escapement,&m_fontSignal); eft, pDoc->GetBubble(i).top, pDoc->Get.Bubble(i).right, pDoc->GetBubble(i).bottom); -=nHeight; pDC->TextOut,,str); dy=m_pointList[i],y-y; m_pointList[i].x=(int)(x+dx**; m_pointList[i],y=(int)(y+dx*+dy*; =DELTA; pointList[0].y=DELTA; pointList[l].x=DELTA+CHIP_WIDTH; pointList[1].y=DELTA; pointList[2].x=DELTA+CHIP_WIDTH/2; pointList[2].y=DELTA+CHIP_WIDTH/2; m_chipList[0].SetChip(1,pointList,3); pointList[0],x=DELTA; pointList[1].x=DELTA; pointList[1].y=DELTA+CHIP_WIDTH; m_chipList[1].SetChip(2,pointList,3); pointList[0].x=DELTA+CHIP_WIDTH; pointList[l].y=DELTA+CHIP_WIDTH/2; pointList[2].x=DELTA+(CHIP_WIDTH*3)/4; pointList[2].y=DELTA+CHIP_WIDTH/4; m_chipList[2].SetChip(3,pointList,3); pointListM.x=DELTA+CHIP_WIDTH/2; pointList[0].y=DELTA+CHIP_WIDTH/2; pointList[l].x=DELTA+CHIPJVIDTH/4; pointList[l].y=DELTA+(CHIP_WIDTH*3)/4; pointList[2].y=DELTA+(CHIP_WIDTH*3)/4; m_chipList[3].SetChip(4,pointList,3); J pointListEU.y=DELTA+CHIP_WIDTH; pointList[2],x=DELTA+CHIP_WIDTH/2; pointList[2].y=DELTA+CHIP_WIDTH; m_chipList[4].SetChip(5,pointList,3); pointList[0].x=DELTA+(CHIP_WIDTH*3)/4; pointList[0].y=DELTA+CHIP_WIDTH/4; pointList[l].x=DELTA+CHIP_WIDTH/2; pointList[3].x=DELTA+CHIP_WIDTH; pointList[3].y=DELTA+CHIP_WIDTH/2; m_chipList[5].SetChip(6,pointList,4); pointList[0].x=DELTA; pointList[0].y=DELTA+CHIP_WIDTH; pointList[l].x=DELTA+CHIP_WIDTH/4; [ pointList[2].y=DELTA+(CHIP_WIDTH*3)/4; pointLis-t[3].x=DELTA+CHIPJVIDTH/2;pointList[3].y=DELTA+CHIP_WIDTH; m_chipList[6].SetChip(7,pointList,4);erialize(ar); rawChip(pDC); tlnChip(point)) SetCapture(); m_bCaptured=TRUE; m_pointMouse=point; m_nCurrIndex=i; etRect()); CSizeoffset(point-m_pointMouse); pDoc->m_chipList[m_nCurrIndex].MoveTo(offset); InvalidateRect(pDoc->m_chipList[m_nCurrIndex].GetRect());