1、第 8 章类与对象81 知识要点1掌握类与对象的概念和定义方法,掌握类成员的访问属性。2掌握构造函数的概念、定义方法和使用方法。3掌握析构函数的概念、定义方法和使用方法。4掌握拷贝构造函数的概念、定义方法和使用方法。5掌握包含对象成员的类构造函数的定义方法。6掌握静态成员的概念、定义方法、作用和特点。7掌握友元的概念、定义方法、作用和特点。8掌握类模板的定义格式与使用方法。82 典型例题分析与解答例题 1:下列有关类的说法不正确的是( )。A对象是类的一个实例B任何一个对象只能属于一个具体的类C一个类只能有一个对象D 类与对象的关系和数据类型与变量的关系相似答案:C分析:对象是类的一个实例,类
2、与对象的关系和数据与变量的关系相似,所以一个类可以有多个对象。例题 2:下面( )项是对构造函数和析构函数的正确定义。Avoid X:X(), void X:X()BX:X(参数),X:X()CX:X(参数),X:X(参数)Dvoid X:X(参数),void X:X(参数)答案:B分析构造函数无返回类型、可带参数、可重载;析构函数无返回类型、不可带参数、不可重载。例题 3:( )的功能是对象进行初始化。A析构函数 B. 数据成员 C.构造函数 D.静态成员函数答案:C分析:当一个对象定义时,C+编译系统自动调用构造函数建立该对象并进行初始化;当一个对象的生命周期结束时,C+编译系统自动调用析
3、构函数注销该对象并进行善后工作;例题 4:下列表达方式正确的是( )。Aclass PBclass Ppublic: public:int x=15; int x;voidshow()coutclass one int a1,a2;public:one(int x1=0, x2=0);void main()one data(2,3);coutclass 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 da
4、ta(2,3);coutclass Amplifierfloat invol,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“class Amplifier float invol,outvol;public:Amplifier(float vin,float vout) invol=vin;outvol=vout;f
5、loat gain();float Amplifier:gain() return outvol/invol;void main() Amplifier amp(5.0,10.0);cout“class pointint x,y;public:point(int a,int b)x=a;y=b;cout#includeclassstudentint 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”)
6、;age=-1;void display()if (no0)cout#includeclass 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 q
7、2):p1(q1),p2(q2) double 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#includeclass Pointpublic: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 D
8、istance(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);coutclass Pointint x,y;public:Point()x=1;y=1;Point()cout#include int count=0;class Pointint x,y;public:Point() x=1;y=1;coun
9、t+;Point()count-;friend void display();;void display() cout class Csampleint i;public:Csample( );void Display( );Csample();Csample:Csample( ) cout#include class Csample int i;public:Csample()cout class Csampleprivate:int i;static int k;public:Csample( );void Display( );int Csample:k=0;Csample:Csampl
10、e( ) i=0;k+;void Csample:Display( ) coutclass 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()coutclass Counterint n;public:Counter(int i=0) n=i;void init_Counter(int m) n=m;void in_Counter()n+;void de_Coun
11、ter()n-;int get_Counter() return n;void show()coutclass 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);coutclass fac int
12、p;public:fac() p=1;fac( int j)p=1;if(j=0) for(int i=1 ;in;fac a(n);coutclass 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()coutymd1;d.setdate(y,m,d1);/加一天d.setdate(y,m,d1);/再加一天d.datetwo();d.show();8.4 补充习题 1选择题(1) 下列有关类的说法不正确的是。A.类是一种用户自
13、定义的数据类型B.只有类中的成员函数或类的友元函数才能存取类中的私有数据C.在类中(用 class 定义),如果不作特别说明,所有的数据均为私有数据D.在类中(用 class 定义),如果不作特别说明,所有的成员函数均为公有数据(2) 以下有关析构函数的叙述不正确的是( )A. 在一个类只能定义一个析构函数 B. 析构函数和构造函数一样可以有形参C. 析构函数不允许用返回值 D. 析构函数名前必须冠有符号“”(3) 以下有关类与结构体的叙述不正确的是( )A. 结构体中只包含数据;类中封装了数据和操作 B. 结构体的成员对外界通常是开放的;类的成员可以被隐藏C. 用 struct 不能声明一个
14、类型名;而 class 可以声明一个类名D. 结构体成员默认为 public;类成员默认为 private(4) 以下叙述中不正确的是( )A. 一个类的所有对象都有各自的数据成员,它们共享函数成员B. 一个类中可以有多个同名的成员函数C. 一个类中可以有多个构造函数、多个析构函数D. 在一个类中可以声明另一个类的对象作为它的数据成员(5) 以下不属于构造函数特征的是( )A. 构造函数名与类名相同 B. 构造函数可以重载C. 构造函数可以设置默认参数 D. 构造函数必须指定函数类型(6) 以下有关类和对象的叙述不正确的是( )A. 任何一个对象都归属于一个具体的类B. 类与对象的关系和数据类
15、型与变量的关系相似C. 类的数据成员不允许是另一个类的对象D. 一个类可以被实例化成多个对象(7) 设有定义:class person int num;char name10;public:void init(int n, char *m);.;person std30;则以下叙述不正确的是( )A. std 是一个含有个元素的对象数组B. std 数组中的每一个元素都是 person 类的对象C. std 数组中的每一个元素都有自己的私有变量 num 和 nameD. std 数组中的每一个元素都有各自的成员函数 init(8) 设有以下类的定义:class Ex int x;public:
16、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有利于数据隐藏C处理类的静态成员变量 D便于继承(11) 以下叙述不正
17、确的是( )使用静态数据成员:A可以节省内存空间 B是为了解决数据共享问题C可以直接用类名来引用 D可以提高序运算速度2.填空题(1) OOP 技术由、方法、消息和继承五个基本的概念所组成。(2)类的成员函数可以在 定义,也可以在定义。(3)类 test 的析构函数名是 。(4)类是用户定义的类型,具有类类型的变量称作_。(5)一个类的析构函数不允许有 。(6)建立对象时,为节省内存,系统只给_分配内存。(7)用于定义 C+的类的关键字有_、_和 union。(8)类 test 的构造函数是和_同名的函数,析构函数是_。(9)类中的数据和成员函数默认访问类型为。(10)当建立一个新对象时,程序
18、自动调用_。 3. 改错题(1) 下面的程序定义了一个 Point 类,找出程序中的错误语句并改正。#includeclass Pointint x;public:void Point(int a)x=a;int Getx()return x;void Show()cout#includeclass part public:Part(char *pname=”no name”) strncpy(name,pname);noofpart+;no=noofpart;coutclass Aint a,b;public:friend void setval(int i,int j);void show
19、A()coutclass test public:test();test(int);test();void display();protected:int n;test:test() coutclass Countpublic:Count() count+;static int getn() return count;Count() count-; private:static int count;int Count:count=100;void main() Count c1,c2,c3,c4;coutclass myclassint a,b;public:void init(int i, int j) a=i; b=j;friend int sum(myclass x);int sum( myclass x)return x.a+x.b; void main()myclass y;y.init(15,20);coutsum(y)endl;5. 编程题(1) 某商店经销一种货物,货物成箱购进,成箱卖出,购进和卖出时以重量为单位,各箱的重量不一样,因此,商店需要记下目前库存货物的总量,要求把商店货物购进和卖出的情况模拟出来。(2) 定义一个 Car 类和 Truck 类,用友元实现两类对象行使速度的快慢比较。