下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 8 章类与对象8 1 知识要点1掌握类与对象的概念和定义方法,掌握类成员的访问属性。2掌握构造函数的概念、定义方法和使用方法。3掌握析构函数的概念、定义方法和使用方法。4掌握拷贝构造函数的概念、定义方法和使用方法。5掌握包含对象成员的类构造函数的定义方法。6掌握静态成员的概念、定义方法、作用和特点。7掌握友元的概念、定义方法、作用和特点。8掌握类模板的定义格式与使用方法。8 2 典型例题分析与解答例题 1 :下列有关类的说法 不正确 的是( )。A.对象是类的一个实例B.任何一个对象只能属于一个具体的类C. 一个类只能有一个对象D类与对象的关系和数据类型与变量的关系相似答案: C分析:对象
2、是类的一个实例,类与对象的关系和数据与变量的关系相似,所以一个类可以有多个对象。例题 2 :下面( )项是对构造函数和析构函数的 正确定义 。A void X:X(), void X:X()B X:X( 参数),X:X()C X:X( 参数),X:X( 参数 )D void X:X( 参数 ),void X:X( 参数 )答案: B分析构造函数无返回类型、可带参数、可重载;析构函数无返回类型、不可带参数、不可重载。例题 3 :( )的功能是对象进行初始化。A.析构函数B.数据成员C.构造函数D.静态成员函数答案: C分析:当一个对象定义时,C+孀译系统自动调用构造函数建立该对象并进行初始化;
3、当一个对象的生命周期结束时,C+®译系统自动调用析构函数注销该对象并进行善 后工作;例题 4 :下列表达方式正确的是( )。A class PB class Ppublic : public :int x=15 ; int x ;voidshow()cout<<x ; void show()cout<<x ; ; C class P D. class Pintf; public :; int a ;f=25 ; void Seta (int x) a=x;答案: D分析:在类体内不可对数据成员进行初始化;类定义结束时需用分号;只有类中的成员函数才能存取类中的私
4、有数据。例题 5 : 拷贝构造函数具有的下列特点中,( )是 错误 的。A.如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的B.拷贝构造函数只有一个参数,并且是该类对象的引用C.拷贝构造函数是一种成员函数D 拷贝构造函数的名字不能用类名答案: D分析:如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的;拷贝构造函数只有一个参数,并且是该类对象的引用;拷贝构造函数的名字与类同名,并且不被指定返回类型;拷贝构造函数是一种成员函数。例题 6 :关于静态成员的描述中,( )是 错误 的。A.静态成员可分为静态数据成员和静态成员函数B.静态数据成员定义后必须在类体内进行初始化C.静
5、态数据成员初始化不使用其构造函数D.静态数据成员函数中不能直接引用非静态成员答案:B分析:静态成员可分为静态数据成员和静态成员函数;静态数据成员被定义后,必须对它进行初始化,初始化在类体外进行,一般放在该类的实现部分最合适,也可以放在其他位置,例如,放在主函数前面等; 静态数据成员初始化与该类的构造函数和析构函数无关; 在静态成员函数的实现中,可以直接引用静态成员,但不能直接引用非静态成员。例题7 :关于友元的描述中,( )是 错误 的。A.友元函数是成员函数,它被说明在类体内B友元函数可直接访问类中的私有成员C友元函数破坏封装性,使用时尽量少用D友元类中的所有成员函数都是友元函数答案:A分析
6、:友元函数是非成员函数,在类体内说明了,在类体外定义,定义和调用等同于一般的普通函数;由于它可以直接访问类的私有成员,因此破坏了类的封装性和隐藏性,尽量少用 。例题 8 :设有如下程序结构: class Box ; void main() Box A,B,C; 该程序运行时调用 (1) 次构造函数;调用 (2) 次析构函数。答案: (1)3(2)3分析:每创建一个对象自动调用一次构造函数,在这里创建了A、日C三个对象,所以共调用了三次构造函数;每释放一个对象,系统自动调用一次析构函数, A、 B、C对象释放时,分别调用析构函数,所以析构函数共调用了三次。例题9:设A为test类的对象且赋有初值
7、,则语句test B(A); 表示。答案: 将对象 A 复制给对象B。分析:执行test B(A); 语句相当于调用了默认复制构造函数,将A 对象的属性复制给 B 对象。例题 10:利用“对象名 . 成员变量”形式访问的对象成员仅限于被声明为 (1) 的成员;若要访问其他成员变量,需要通过(2) 函数或 (3) 函数。答案:(1) public (2) 成员函数 (3) 友元函数分析:类体内的数据成员可声明为公有的、私有的和保护的,公有的数据成员可利用“对象名 . 成员变量”形式来进行访问; 私有的数据成员能被类中的其他成员函数或友元函数所调用;保护的数据成员可以在类体中使用,也可以在派生类中
8、使用,但不能在其他类外通过对象使用。例题 11:分析找出以下程序中的错误,说明错误原因,给出修改方案使之能正确运行。#include<iostream.h>class one int a1,a2;public:one(int x1=0, x2=0);void main()one data(2,3);cout<< data.a1 <<endl;cout<< data.a2 <<endl;分析 :出错原因:构造函数参数表语法错;构造函数没有函数体;类的对象不能直接访问类的私有成员变量。改正后的程序如下:#include<iostre
9、am.h>class one int a1, a2;public:one(int x1=0, int x2=0) a1=x1;a2=x2;int geta1() return a1; int geta2() return a2; ;void main()one data(2,3);cout<<data.geta1()<<endl;cout<<data.geta2()<<endl;例题12:分析以下程序的错误原因,给出修改方案使之能正确运行。#include <iostream.h>class Amplifierfloat inv
10、ol,outvol;public:Amplifier(float vin,float vout) invol=vin;outvol=vout; float gain();Amplifier:float gain() return outvol/invol; void main()Amplifier amp(5.0,10.0);cout<<"nnThe gain is =>"<<gain()<<endl;分析: 成员函数在类体外定义格式是: 函数返回类型类名: : 成员函数名 (参数表) ;成员函数调用格式是:对象名 . 成员函数名(
11、参数表)。改正后的程序如下:#include <iostream.h>class Amplifier float invol,outvol;public:Amplifier(float vin,float vout) invol=vin;outvol=vout; float gain();float Amplifier:gain() return outvol/invol;void main() Amplifier amp(5.0,10.0);cout<<"nnThe gain is =>"<<amp.gain()<<e
12、ndl;例题13:下列程序的运行结果是 #include <iostream.h>class pointint x,y;public:point(int a,int b)x=a;y=b;cout<<"calling the constructor function."<<endl;point(point &p);friend point move(point q);point()cout<<"calling the destructor function.n"int getx()return x;i
13、nt gety() return y;point:point(point &p)x=p.x;y=p.y;cout<<"calling the copy_initialization constructor function.n"point move(point q)cout<<"OK!n"int i,j;i=q.x+10;j=q.y+20;point r(i,j);return r;void main() point m(15,40),p(0,0);point n(m);p=move(n);cout<<&quo
14、t;p="<<p.getx()<<","<<p.gety()<<endl;分析:根据构造函数、拷贝构造函数和友元函数的特点,执行该程序后,输出结果是:calling the constructor function.calling the constructor function.calling the copy_initialization constructor function.calling the copy_initialization constructor function.OK! calling th
15、e constructor function.calling the copy_initialization constructor function.calling the destructor function.calling the destructor function.calling the destructor function.P=25,60calling the destructor function.calling the destructor function.calling the destructor function.说明:(1)构造函数执行三次,分别初始化主函数中的
16、对象m p和move函数中的对象r。( 2) 拷贝构造函数共执行了三次。第一次, 初始化对象n; 第二次在调用函数move()时,实参n给形参q进行初始化;第三次是执行函数 move的return r ;语句时, 系统用 r 初始化一个匿名对象时使用了拷贝构造函数。(3)析构函数执行了六次。在退出函数move时释放对象r和q共调用二次;返回主函数后,匿名对象赋值给对象p 后,释放匿名对象又调用一次析构函数;最后退出整个程序时释放对象m, n 和 p 调用三次。例题 14:定义一个学生类,其中有3 个数据成员:学号、姓名、年龄,以及若干成员函数。同时编写 main 函数使用这个类,实现对学生数据
17、的赋值和输出。程序代码如下:#include<iostream.h>#include<string.h>classstudentint no;char name10;int age;public:student(int i, char *str, int g)no=i;strcpy(name,str);age=g;student( )no=0;strcpy(name, ” none” );age=-1;void display()if (no>0)cout<< ” no” <<no<<” : ” <<name<
18、”<is ” <<age<<” years old. n”;elsecout<< ” no” <<no<<” : None! n”;void main() student d1(1001,” Tom” ,18);d1.display();student d2;d2.display();例题15:计算两点之间的距离。方法一:可以定义点类( Point ),再定义一个类( Distance )描述两点之间的距离,其数据成员为两个点类对象,两点之间距离的计算可设计由构造函数来实现。#include<iostream.h>#
19、include<math.h>class Point public:Point(int a=0, int b=0) x=a; y=b; int xcord() return x;int ycord () return y;private:int x,y;class Distance public:Distance(Point q1,Point q2);double getdist() return dist; private:Point p1,p2;double dist;Distance:Distance(Point q1,Point q2):p1(q1),p2(q2) doub
20、le x=double(p1.xcord()-p2.xcord();double y=double(p1.ycord()-p2.ycord();dist=sqrt(x*x+y*y);void main() Point p(0,0),q(1,1);Distance dis(p,q);cout<< ” The distance is: ” <<dis.getdist()<<endl;方法 2 :将两点之间距离函数声明为 Point 类的友元函数。#include<iostream.h>#include<math.h>class Point
21、public:Point(int a=0, int b=0) x=a; y=b; int xcord() return x;int ycord () return y;private:int x,y;friend double Distance(Point p1,Point p2);double Distance(Point p1,Point p2) double dx=double(p1.x-p2.x);double dy=double(p1.y-p2.y);return sqrt(dx*dx+dy*dy);void main() Point q1(0,0),q2(1,1);cout<
22、<” The distance is: ” <<Distance(q1,q2)<<endl; 8 3 教材习题分析与解答1选择题( 1)对类的构造函数和析构函数描述正确的是()。A. 构造函数可以重载,析构函数不能重载B. 构造函数不能重载,析构函数可以重载C. 构造函数可以重载,析构函数也可以重载D. 构造函数不能重载,析构函数也不能重载答案: A( 2)类的析构函数的作用是(D)。A. 一般成员函数B. 类的初始化 C. 对象初始化 D. 删除对象答案: D( 3)假设OneClass 为一个类,则该类的拷贝初始化构造函数的声明语句为( )。A.OneClas
23、s(OneClass p); B. OneClass& (OneClass p);C. OneClass(OneClass & p);D. OneClass (OneClass *p);答案: C(4) 下面对于友元函数描述正确的是( )。A. 友元函数的实现必须在类的内部定义B. 友元函数是类的成员C. 友元函数破坏了类的封装性和隐藏性D.友元函数不能访问类的私有成员答案: C( 5)对于结构中定义的成员,其默认的访问权限为()。A.public B. protected C.privateD. static答案: C(6) 为了使类中的某个成员不能被类的对象通过成员操作符访
24、问, 则不能把该成员的访问权限定义为()。A.public B. protected C.privateD. static答案: A( 7)下面对静态数据成员的描述中,正确的是()。A. 静态数据成员可以在类体内进行初始化B. 静态数据成员不可以在类体内进行初始化C. 静态数据成员不能受 private 控制符的作用D. 静态数据成员可以直接用类名调用答案: C( 8)下面对静态数据成员的描述中,正确的是()。A. 静态数据成员是类的所有对象共享的数据B. 类的每一个对象都有自己的静态数据成员C. 类的不同对象有不同的静态数据成员值D. 静态数据成员不能通过类的对象调用答案: A2写出下列程序
25、的运行结果。( 1) #include <iostream.h>class Pointint x,y;public:Point()x=1;y=1;Point()cout<<"Point "<<x<<','<<y<<" is deleted."<<endl; ;void main()Pointa;运行结果为:Point 1,1 is deleted.( 2) #include <iostream.h>#include <conio.h>
26、;int count=0;class Pointint x,y;public:Point() x=1;y=1;count+;Point()count-;friend void display();;void display() cout <<"There are "<<count<<" points,"<<endl;void main() Point a;display();Point b5;display();display();运行结果为:There are 1 points,There are 6 p
27、oints,There are 1 points,( 3) #include<iostream.h>class Csampleint i;public:Csample( );void Display( );Csample();Csample:Csample( ) cout<< ” Constructor ” <<” , ”;i=0;void Csample:Display() cout<< ” i= ” <<i<<” , ” ; Csample:Csample( ) cout<< ” Destructor ”
28、<<endl;void main( ) Csample a;a.Display( );运行结果为:Constructor,i=0,Destructor(4) #include <iostream.h>#include <conio.h>class Csample int i;public:Csample()cout <<"constructor1" <<endl; Csample(int val)cout <<"Constructor2"<<endl;i=val;void
29、 Display()cout<<"i="<<i<<endl;Csample()cout<<"Destructor"<<endl;getch();void main()Csample a,b(10);a.Display();b.Display();运行结果为:Constructor1Constructor2i=-858993460i=10DestructorDestructor(5)#include<iostream.h>class Csampleprivate:int i;stati
30、c int k;public:Csample( );void Display( );int Csample:k=0;Csample:Csample( ) i=0;k+; void Csample:Display( ) cout<< void main( ) Csample a,b;a.Display( );b.Display( );运行结果为 :i=0,k=2i=0,k=23按要求编写程序。(1) 编写一个程序,设计一个产品类class Productchar *name;/ 产品名称int price; / 产品单价int quantity ; / 剩余产品数量public:pr
31、oduct(char *n,int p int q); /product( ); / 析构函数” i= ” <<i<<” ,k= ” <<k<<endl;Product, 其定义如下:构造函数void buy(int money);/ 购买产品void get() const;/ 显示剩余产品数量;并用数据进行测试。(2) 计算两点之间的距离。提示: 可以定义点类( Point ) , 再定义一个类( Distance ) 描述两点之间的距离,其数据成员为两个点类对象,两点之间距离的计算可设计由构造函数来实现。参照本章例 15(3) 定义盒子 B
32、ox 类,要求具有以下成员:可设置盒子形状;可计算盒子体积;可计算盒子的表面积。#include<iostream.h> class Box int x,y,z;int v,s;public:void init(int x1=0,int y1=0,int z1=0)x=x1;y=y1;z=z1;void volue()v=x*y*z;void area() s=2*(x*y+x*z+y*z);void show()cout<<"x= "<<x<<"y= "<<y<<" z=
33、"<<z<<endl;cout<<"s= "<<s<<"v= "<<v<<endl;void main() Box a;a.init(2,3,4);a.volue();a.area();a.show();(4) 定义计数器类 Counter 。 要求具有以下成员: 计数器值; 可进行增值和减值记数;可提供记数值。#include<iostream.h>class Counterint n;public:Counter(int i=0) n=i;voi
34、d init_Counter(int m) n=m;void in_Counter()n+;void de_Counter()n-;int get_Counter() return n;void show()cout<<n<<endl;void main() Counter a;a.in_Counter(); a.show();a.init_Counter(10);a.show();a.de_Counter();cout<<a.get_Counter()<<endl;(5) 编写一个程序计算两个给定的长方形的周长和面积。#include<i
35、ostream.h>class rectangle int len,wid;public:rectangle(int i=0,int j=0) len=i;wid=j;friend int area(rectangle temp) int s=temp.len*temp.wid;return s;friend fun(rectangle temp)int p=2*(temp.len+temp.wid);return p;void main()rectangle a(10,20);cout<<"长方形的周长和面积为:"<<area(a)<&
36、lt;"t"<<fun(a)<<endl;rectangle b(100,200);cout<<"长方形的周长和面积为:"<<area(b)<<"t"<<fun(b)<<endl;(6)编写一个程序,采用一个类求 n!,并输出10!的值。#include<iostream.h>class fac int p;public:fac() p=1;fac( int j)p=1;if(j>=0)for(int i=1 ;i<=j;i+)
37、 p=p*i;else cout<<"数据错误 n"void show() cout<<"阶乘为:"<<p<<endl;void main() int n;cout<<"请输入一个整数:"cin>>n;fac a(n);cout<<n; a.show();(7)编写一个程序,设计一个 Cdate类,它应该满足下面的条件:1)用这样的格式输出日期:日-月-年;2)输出在当前日期上加两天后的日期;3)设置日期。#include<iostream.h&
38、gt;class Cdateint year,month,day;int y1,m1,d1;public:void setdate(int y,int m,int d) year二y;month二m;day二d;void show()cout<<"当前日期:"<<day<<"-"<<month<<"-"<<year<<endl;cout<<"两天后日期:"<<d1<<"-"&l
39、t;<m1<<"-"<<y1<<endl;void datetwo() /加一天后的年月日 d1=day;y1=year;m1=month;for(int i=0;i<2;i+)d1+;switch(d1)case 29:if(!(month=2 &&(year%400=0|year%4=0&&year%100!=0) m1=3;d1=1;break;case 30:if(month=2 &&(year%400=0|year%4=0&&year%100!=0)m1
40、=3;d1=1;break;case 31:if(month=4|month=6|month=9|month=11)m1=m1+1;d1=1;break;case 32: m1=m1+1;d1=1;if(month=12)y1=y1+1;m1=1;break;void main()Cdated;int y,m,d1;cout<<" 请输入年月日 : "cin>>y>>m>>d1;d.setdate(y,m,d1);/加一天d.setdate(y,m,d1);/再加一天d.datetwo();d.show();8.4 补充习题1
41、选择题(1) 下列有关类的说法不正确的是。A. 类是一种用户自定义的数据类型B. 只有类中的成员函数或类的友元函数才能存取类中的私有数据C.在类中(用class定义),如果不作特别说明,所有的数据均为私有数据D. 在类中 ( 用 class 定义 ) ,如果不作特别说明,所有的成员函数均为公有数据(2) 以下有关析构函数的叙述不正确的是( )A. 在一个类只能定义一个析构函数B. 析构函数和构造函数一样可以有形参C. 析构函数不允许用返回值D. 析构函数名前必须冠有符号“ ”(3) 以下有关类与结构体的叙述不正确的是( )A. 结构体中只包含数据;类中封装了数据和操作B. 结构体的成员对外界通
42、常是开放的;类的成员可以被隐藏C. 用 struct 不能声明一个类型名;而class 可以声明一个类名D. 结构体成员默认为public ;类成员默认为private(4) 以下叙述中不正确的是( )A. 一个类的所有对象都有各自的数据成员,它们共享函数成员B. 一个类中可以有多个同名的成员函数C. 一个类中可以有多个构造函数、多个析构函数D. 在一个类中可以声明另一个类的对象作为它的数据成员(5) 以下不属于构造函数特征的是( )A. 构造函数名与类名相同 B. 构造函数可以重载C. 构造函数可以设置默认参数D. 构造函数必须指定函数类型(6) 以下有关类和对象的叙述不正确的是( )A.
43、任何一个对象都归属于一个具体的类B. 类与对象的关系和数据类型与变量的关系相似C. 类的数据成员不允许是另一个类的对象D. 一个类可以被实例化成多个对象(7) 设有定义:class person int num;char name10;public:void init(int n, char *m);.;person std30;则以下叙述不正确的是( )A. std是一个含有3 0个元素的对象数组B. std 数组中的每一个元素都是person 类的对象C. std数组中的每一个元素都有自己的私有变量 num和nameD. std 数组中的每一个元素都有各自的成员函数init(8) 设有以下
44、类的定义:class Ex int x;public:void setx(int t=0);若在类外定义成员函数setx(), 以下定义形式中正确的是( )A. void setx(int t) . B. void Ex:setx(int t) . C. Ex:void setx(int t) . D. void Ex:setx() . (9) 以下关于静态成员变量的叙述不正确的是( )A.静态成员变量为类的所有对象所公有B.静态成员变量可以在类内任何位置上声明C.静态成员变量的赋初值必须放在类外D.定义静态成员变量时必须赋初值(10) 定义静态成员函数的主要目的是( )A.方便调用B.有利于
45、数据隐藏C.处理类的静态成员变量D.便于继承(11) 以下叙述不正确的是( )使用静态数据成员:A.可以节省内存空间B.是为了解决数据共享问题C.可以直接用类名来引用D.可以提高序运算速度2. 填空题(1) OOP 技术由、方法、消息和继承五个基本的概念所组成。(2) 类的成员函数可以在 定义,也可以在定义。(3) 类 test 的析构函数名是。(4) 类是用户定义的类型,具有类类型的变量称作。(5) 一个类的析构函数不允许有。(6) 建立对象时,为节省内存,系统只给分配内存。用于定义 C+勺类的关键字有 、?口 union。(8) 类 test 的构造函数是和同名的函数,析构函数是(9) 类
46、中的数据和成员函数默认访问类型为。(10) 当建立一个新对象时,程序自动调用 。3. 改错题(1) 下面的程序定义了一个Point 类,找出程序中的错误语句并改正。#include<iostream.h>class Pointint x;public:void Point(int a)x=a;int Getx()return x;void Show()cout<<Getx()<<endl; ;void main()Point A(76);cout<<A.Show();(2) 根据静态成员的特点,指出下列程序的错误。#include<iostream.h>#include<string.h>class part public:Part(char *pname= ” no name”) strncpy(name,pname);noofpart+;no=noofpart;cout<<” create the no: ” <<noofpart<&l
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年安全生产管理制度考核培训指导基础实施办法及解析
- 民间音乐传承与发展的支持承诺书6篇
- 人才选聘诚信守则承诺书(5篇)
- 学校课前唱歌制度规范
- 医院秘密探班制度规范
- 食品洁净室保养制度规范
- 上海汽车拍卖制度规范
- 精神科库房管理制度规范
- 住院病历书写规范制度
- 外国广告代理制度规范
- 国家开放大学《理工英语4》期末机考题库
- 货车司机外包合同协议
- 游戏推广合作协议书范本
- 房地产企业分红权激励方案
- 车辆维修安全培训
- 2025版国家开放大学法学本科《知识产权法》期末纸质考试总题库
- 五年级上册小数四则混合运算100道及答案
- 九宫数独200题(附答案全)
- 部编版八年级上册语文《期末考试卷》及答案
- 医院信访维稳工作计划表格
- 地下车库建筑结构设计土木工程毕业设计
评论
0/150
提交评论