C 语言程序设计( Visual C++6.0 环境)》习题答案习题十、思考题1.简述公有类型成员与私有类型成员的区别。
公有(public) 类型成员不但可以被类的成员函数访问,而且可以被外界访问,所以说公有类型定义了类的外部接口。
私有(private) 类型成员只能被类的成员函数访问,外界不能直接访问它。
类的数据成员一般都应该声明为私有成员。
2.简述构造函数与析构函数的作用。
构造函数的作用就是在对象在被创建时利用特定的值构造对象,将对象初始化。
析构函数的作用与构造函数正好相反,它是用来在对象被删除前进行一些清理工作。
析构函数调用之后,对象被撤消了,相应的内存空间也将被释放。
3.简述什么是友元函数。
友元函数是在类定义中由关键字friend 修饰的非成员函数。
友元函数可以是一个普通函数,也可以其它类中的一个成员函数,它不是本类的成员函数,但它可以访问本类的私有成员和保护成员。
4.简述公有继承、私有继承和保护继承三种继承方式的区别。
⑴、当类的继承方式为公有(public 继承)时,基类的公有(public )成员和保护( protected )成员仍然成为派生类的公有成员和保护成员,而基类的私有成员不能被派生类访问。
⑵、当类的继承方式为保护( protected )继承时,基类的公有(public )成员和保护( protected )成员将成为派生类的保护成员,而基类的私有成员不能被派生类访问。
⑶、当类的继承方式为私有(private )继承时,基类的公有(public )成员和保护(protected )成员将成为派生类的私有成员,而基类的私有成员不能被派生类访问。
5.定义一个圆柱体类,其属性为圆柱体的底面半径和高,能计算出圆柱体的体积。
#include<iostream.h>class cylinder{public:cylinder(float r,float h){radius=r;height=h;}float Volume();private:float radius;float height;};float cylinder::Volume(){return 3.14*radius*radius*height;}void main(){float r,h;cout<<" 请输入圆柱体的底面半径和高:"; cin>>r>>h;cylinder x(r,h);cout<<x.Volume()<<endl;}6.从第 5 题中定义的圆柱体类中派生出圆锥类,覆盖计算体积的成员函数。
#include<iostream.h>class cylinder{public:cylinder(float r,float h){radius=r;height=h;}float Volume();private:float radius;float height;};float cylinder::Volume(){return 3.14*radius*radius*height;}class cone:public cylinder{public:float Volume();cone(float r,float h):cylinder(r,h){};};float cone::Volume(){return cylinder::Volume()/3.0;}void main()float r,h;{cout<<" 请输入圆锥体的底面半径和高:"; cin>>r>>h;cone x(r,h); cout<<x.Volume()<<endl;}7.定义一个生日( birthday )类,有年、月、日三个数据成员和输出生日成员函数。
#include<iostream.h>class birthday{public:birthday(int y,int m,int d){ year=y;month=m;day=d;}void PrintBirth();private:int year;int month;int day;};void birthday::PrintBirth(){ cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;}void main(){birthday b(2000,12,12); b.PrintBirth();}8 •定义一个形状(shape)类,在此基础上派生出矩形类和圆类,二者都有用来计算面积和周长的成员函数。
#include<iostream.h> class shape{public:float GetArea();float GetPerimeter();};class rectangle:public shape{private:float width;float height;public:rectangle(float w,float h){width=w; height=h;}float GetArea(){return width*height;}float GetPerimeter(){return 2*(width+height);}};class circle:public shape{private:float radius;public:circle(float r){radius=r;}float GetArea(){return 3.14*radius*radius;}float GetPerimeter(){return 2*3.14*radius;}};void main(){rectangle r(7,8);cout<<r.GetArea()<<endl;cout<<r.GetPerimeter()<<endl;circle c(3);cout<<c.GetArea()<<endl;cout<<c.GetPerimeter()<<endl;}9.定义一个坐标类,有横坐标和纵坐标两个属性及输出坐标位置成员函数,重载“+使其可以对两个坐标类对象进行求和。
#include<iostream.h>class coordinate{private:int x_axis;int y_axis;public:coordinate(int x=0,int y=0){x_axis=x;y_axis=y;}void PrintCoordinate(){cout<<x_axis<<","<<y_axis<<endl;}friend coordinate operator +(coordinate a,coordinate b){coordinate m;m.x_axis=a.x_axis+b.x_axis;m.y_axis=a.y_axis+b.y_axis;return coordinate(m.x_axis,m.y_axis);}};void main(){coordinate x1(10,20),x2(5,30),w;x1.PrintCoordinate();x2.PrintCoordinate();w=x1+x2;w.PrintCoordinate();}10.创建一个Point 类,用来描述坐标系中的一个点。
点具有横坐标和纵坐标两个属性,同时应具有成员函数用来显示点的坐标。
再创建一个Circle 类,用来描述坐标系中的一个圆。
圆应具有圆心坐标和半径两个属性,还应具有得到圆心坐标和显示圆的属性等相关的成员函数。
由于圆心是一个点( Point 类),所以在创建Circle 类时可以从Point 类继承。
坐标系中的两个圆有相交、相离和相切三种关系,为了描述这些关系,需要用到圆心坐标之间的距离及两圆半径之和。
为了计算方便,我们可以重载“+”运算符返回两圆半径之和;重载“ -”运算符返回两点之间的距离。
#include<iostream.h>#include<math.h>class Point{private:double x,y;public:Point(){}Point(double px,double py){x=px;y=py;}void show()// 定义Point 类// 私有成员(点的坐标)//构造函数//构造函数//成员函数(显示坐标){{cout<<"("<<x<<","<<y<<")";}friend double operator-(Point p1,Point p2){ returnsqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}//"-" 运算符重载 //返回两点之间的距离};class Circle:public Point// 从 Point 类派生 Circle 类{ private:Point p;double r; // 私有成员public:Circle(double px,double py,double cr):Point(px,py){ // 派生类的构造函数p=Point(px,py);r=cr;}void show(){ cout<<"[p"; Point::show();cout<<","<<r<<"]";}Point GetCenter(){return p; friend double operator+(Circle c1,Circle c2) {return c1.r+c2.r;//"+" 运算符重载 ,返回两圆半径之和} };//覆盖基类的成员函数//成员函数 ( 返回圆心 )void Crelation(Circle cr1,Circle cr2){ // 定义函数说明两圆的关系if((cr1.GetCenter()-cr2.GetCenter())>(cr1+cr2))cout<<" 两圆相离"<<endl;if((cr1.GetCenter()-cr2.GetCenter())==(cr1+cr2)) cout<<" 两圆相切"<<endl;if((cr1.GetCenter()-cr2.GetCenter())<(cr1+cr2)) cout<<" 两圆相交"<<endl; }void main()Pointp1(1,1); 〃定义Point 类对象plPoint p2(4,5); //定义Point 类对象p2cout<<"p1与p2两点之间的距离为:"<<endl;p1.show(); 〃输出pl 坐标cout<<"->";p2.show();cout<<"="<<p1-p2<<e ndl; Circle c1(0,0,1);//输出p2坐标//输出两点之间的距离//定义Circle类对象c1Circle c2(3,0,2); //定义Circle 类对象c2cout<<"c1与c2两圆圆心之间的距离为:"<<endl;//输出c1圆心及半径cout<<"->";c2.show(); 〃输出c2圆心及半径cout<<"="<<c1.GetCe nter()-c2.GetCe nter()<<e ndl;//输出两圆圆心之间的距离cout<<"两圆的半径之和为:"<<c1+c2<<e ndl;cout<<"两圆之间的关系为:"Crelatio n( c1,c2);}二、填空题1 •除了类的成员函数能够访问类的私有成员外,还有友元函数。