C++习题与解答.doc
第6章 ;类和对象(一)练习题66.1 判断题× 1使用class定义的类,其默认的访问权限是公有的,使用struct定义的类,其默认的访问权限是私有的。× 2类中的成员函数都是公有的,数据成员都是私有的。× 3定义在类体内的成员函数是内联函数,定义在类体外的成员函数不能是内联函数。 4类定义后,它的成员个数及名称就不会再被改变了。× 5定义或说明对象时,系统会自动调用构造函数为创建的对象初始化。如果类中没有定义任何构造函数时,就无法给定义的对象初始化。 6定义一个对象时,系统只为该对象的数据成员开辟内存空间,而成员函数是同类对象共享的。 7对象成员的表示方法与结构变量成员的表示方法相同。 8创建对象时系统自动调用相应的构造函数为对象初始化,没有相应的构造函数时,系统会自动生成。 9构造函数是一个其名与类名相同的特殊的成员函数。× 10析构函数是一个函数体为空的成员函数。 11构造函数和析构函数都是系统自动调用的成员函数。× 12构造函数和析构函数都可以重载。 13成员函数与一般函数一样可以重载、内联和设置参数的默认值。× 14静态成员是指静态对象的成员。× 15静态数据成员必须在构造函数的成员初始化列表中进行初始化。 16静态成员都可以使用类名加作用域运算符的方法来引用。× 17静态成员函数中引用静态数据成员和非静态数据成员的方式是相同的。 18常成员指的是类体内使用const关键字说明的常数据成员和常成员函数。× 19常数据成员在常成员函数中的值是不允许改变的,而在非常成员函数中是允许改变的。 20常对象需要引用常成员函数,而不能引用非常成员函数。× 21常对象的数据成员都是常数据成员。 22友元函数是说明在类体内的非成员函数,它可以访问类中的所有成员。× 23可以把一个一般函数说明为某类的友元函数,也可以将某类的成员函数说明为另类的友元函数。 24友元类中的所有成员函数都是友元函数。 25类型转换函数是一种特殊的成员函数,定义时不加类型说明,无函数参数。 26单参数的构造函数具有类型转换的作用。6.2 单选题1下列关于类的定义格式的描述中,错误的是( C )。A类中成员有3种访问权限B类的定义可分说明部分和实现部分C类中成员函数都是公有的,数据成员都是私有的D定义类的关键字通常用class,也可用struct2下列关键字中,不属于定义类时使用的关键字是( D )。AclassBstructCpublicDdefault3下列关于成员函数的描述中,错误的是( A )。A成员函数的定义必须在类体外B成员函数可以是公有的,也可以是私有的C成员函数在类体外定义时,前加inline可为内联函数D成员函数可以设置参数的默认值4下列关于对象的描述中,错误的是( D )。A定义对象时系统会自动进行初始化B对象成员的表示与C语言中结构变量的成员表示相同C属于同一个类的对象占有内存字节数相同D一个类所能创建对象的个数是有限制的5下列关于构造函数的描述中,错误的是( C )。A构造函数可以重载B构造函数名同类名C带参数的构造函数具有类型转换作用D构造函数是系统自动调用的6下列关于析构函数的描述中,错误的是( A )。A析构函数的函数体都为空B析构函数是用来释放对象的C析构函数是系统自动调用的D析构函数是不能重载的7下列关于静态成员的描述中,错误的是( C )。A静态成员都是使用static来说明的B静态成员是属于类的,不是属于某个对象的C静态成员只可以用类名加作用域运算符来引用,不可用对象引用D静态数据成员的初始化是在类体外进行的8下列关于常成员的描述中,错误的是( C )。A常成员是用关键字const说明的B常成员有常数据成员和常成员函数两种C常数据成员的初始化是在类体内定义它时进行的D常数据成员的值是不可以改变的9下列关于友元函数的描述中,错误的是( B )。A友元函数不是成员函数B友元函数只可访问类的私有成员C友元函数的调用方法同一般函数D友元函数可以是另一类中的成员函数10下列关于类型转换函数的描述中,错误的是( C )。A类型转换函数是一种成员函数B类型转换函数定义时不指出类型,也没有参数C类型转换函数的功能是将其函数名所指定的类型转换为该类类型D类型转换函数在一个类中可定义多个6.3 填空题1类体内成员有3个访问权限,说明它们的关键字分别是 公有 、 私有 和 保护 。2使用class定义的表中,成员的默认访问权限是 私有 的;由struct定义的类中,成员的默认的访问权限是 公有 的。3如果一个类中没有定义任何构造函数时,系统会自动提供一个 默认 构造函数;同样,类中没有定义析构函数时,系统会自动提供一个 默认 析构函数。4静态成员是属于 类 的,它除了可以通过对象名来引用外,还可以使用 类名限定 来引用。5友元函数是被说明在 类体 内的 非 成员函数。友元函数可访问该类中的 成员。6完成下列类的定义。 class A public: A() a=0; int int Geta( A &m); private: int a; ; int Geta( A &m) return m.a; 6.4 分析下列程序的输出结果1 #include <iostream.h> class A public: A() a1=a2=0; cout<<"Default constructor called.n" A(int i,int j); A() cout<<"Destructor called.n" void Print() cout<<"a1="<<a1<<','<<"a2="<<a2<<endl; private: int a1,a2; ; A:A(int i,int j) a1=i; a2=j; cout<<"Constructor called.n" void main() A a,b(5,8); a.Print(); b.Print(); 答: Default constructor called. Constructor called. a1=0,a2=0 a1=5,a2=8 Destructor called. Destructor called.2 #include <iostream.h> class B public: B() cout<<+b<<endl; B() cout<<b-<<endl; static int Getb() return b; private: static int b; ; int B:b=10; void main() B b1,b2,b3; cout<<B:Getb()<<endl; 答: 11 12 13 13 13 12 113 #include <iostream.h> class Date public: Date(int y,int m,int d) year=y; month=m; day=d; friend void Print(Date &); private: int year,month,day; ; void Print(Date &d) cout<<d.year<<'/'<<d.month<<'/'<<d.day<<endl; void main() Date d1(2005,10,1),d2(2005,12,9); Print(d1); Print(d2); 答: 2005/10/1 2005/12/94 #include <iostream.h> class C public: C(int i,int j) c1=i;c2=j; void Sum(C a,C b) c1=a.c1+b.c1; c2=a.c2+b.c2; void Print() cout<<"c1="<<c1<<','<<"c2="<<c2<<endl; private: int c1,c2; ; void main() C a(6,9); C b(a); C c(b); c.Sum(a,b); c.Print(); 答: c1=12,c2=185 #include <iostream.h> class S public: S() PC=0; S(S &s) PC=s.PC; for(int i=0;i<PC;i+) elemsi=s.elemsi; void Empty() PC=0; int IsEmpty() return PC=0; int IsMemberOf(int n); int Add(int n); void Print(); private: int elems100,PC; ; int S:IsMemberOf(int n) for(int i=0;i<PC;i+) if(elemsi=n) return 1; return 0; int S:Add(int n) if(IsMemberOf(n) return 1; else if(PC=100) return 0; else elemsPC+=n; return 1; void S:Print() cout<<'' for(int i=0;i<PC-1;i+) cout<<elemsi<<',' if(PC>0) cout<<elemsPC-1; cout<<''<<endl; void main() S a; cout<<a.IsEmpty()<<endl; a.Print(); S b; for(int i=1;i<=5;i+) b.Add(i); b.Print(); cout<<b.IsMemberOf(3)<<endl; cout<<b.IsEmpty()<<endl; for(i=6;i<=10;i+) b.Add(i); S c(b); c.Print(); 答: 1 1,2,3,4,5 1 0 1,2,3,4,5,6,7,8,9,106.5 编程题1按下列要求编程:(1)定义一个描述矩形的类Rectangle,包括的数据成员有宽(width)和长(length);(2)计算矩形周长;(3)计算矩形面积;(4)改变矩形大小。通过实例验证其正确性。答:编程如下: #include <iostream.h> class Rectangle public: Rectangle(int a,int b) width=a; length=b; int Area() return width*length; int Periment() return 2*(width+length); void Changesize(int a,int b) width=a; length=b; void Print(); private: int width,length; ; void Rectangle:Print() cout<<"AREA="<<Area()<<endl;cout<<"PERIMENT="<<Periment()<<endl; void main() Rectangle r(5,8); r.Print();r.Changesize(3,9);r.Print(); 2 编程实现一个简单的计算器。要求从键盘上输入两个浮点数,计算出它们的加、减、乘、除运算的结果。答:编程如下: #include <iostream.h> class ASMD public: ASMD(double a,double b) x=a; y=b; void Addition() cout<<x+y<<endl; void Subtration() cout<<x-y<<endl; void Multiply() cout<<x*y<<endl; void Divison() cout<<x/y<<endl; void Print(); private: double x,y; ; void ASMD:Print() Addition();Subtration();Multiply();Divison(); void main() ASMD a(40,8); a.Print(); 3编一个关于求多个某门功课总分和平均分的程序。具体要求如下:(1)每个学生信息包括姓名和某门功课成绩。(2)假设5个学生。(3)使用静态成员计算5个学生的总成绩和平均分。答:编程如下: #include <iostream.h> #include <string.h> class Student public: Student(char s,int gr) strcpy(name,s); grade=gr; totalize+=gr; static void Print(); private: char name10; int grade; static int totalize; ;int Student:totalize=0; void Student:Print() cout<<"总成绩为 "<<totalize<<",平均成绩为 "<<totalize/5<<endl; void main() Student s1("ma",85),s2("Wang",96),s3("Li",82),s4("lu",78),s5("zhang",80);Student:Print(); 6.6 简单回答下列问题1 一个类中是否必须有用户定义的构造函数?如果用户没有定义构造函数,又如何对创建的对象初始化?答:一个类用户可以不定义构造函数,这时系统自动提供一个默认的构造函数,并可用该构造函数对创建的对象初始化。2 拷贝构造函数具有几个参数?它有类型转换的作用吗?答:拷贝构造函数具有一个参数,即为该类对象的引用。拷贝构造函数没有类型转换作用。3 静态成员属于类的,是否每个对象都可以引用该静态成员?答:可以。4 常对象可以引用非常成员函数吗?非常对象可以引用常成员函数吗?答:不可以。可以。5友元函数能否访问类中的保护成员?友元函数访问类中私有成员与成员函数访问私有成员的形式相同吗?答:能。相同。第7章类和对象(二)练习题77.1 判断题× 1定义对象指针时也要调用构造函数。 2对象指针可用同类对象的地址值给它赋值。× 3对象指针成员表示与对象引用相同。 4常类型指针有两种,一种是指针的地址值是常量,另一种是指针所指向的变量或对象是常量。× 5指向对象的常指针的地址值是可以改变的。× 6指向常对象的指针所指向的对象是可以改变的。 7this指针是系统生成的指向当前被某个成员函数操作对象的指针。× 8对象引用可以用一个同类对象的地址值对它赋值。× 9定义对象引用时,可以对其引用进行初始化,也可以不进行初始化。× 10对象数组的元素可以是不同类的对象。× 11对象指针数组可以使用不同类的对象的地址值进行初始化。× 12给对象数组元素赋值时都要创建临时对象。 13指向一维对象数组的指针是一个二级指针。× 14自身类对象可作该类的子对象。 15子对象的初始化要在构造函数的成员初始化列表中进行。 16使用new运算符创建的对象称为堆对象。 17任何对象都可以使用delete运算符来释放。× 18使用new运算符创建的对象数组其元素都具有默认值。 19类的作用域范围指的是类体内。× 20对象的存储类只有外部的和静态的。7.2 单选题1f1()函数是类A的公有成员函数,p是指向类的成员函数f1()的指针,下列表示中正确的是( C )。Ap=f1()Bp=f1Cp=A:f1Dp=A:f1()2p是指向类A数据成员a的指针,a是类A的一个对象。在给a成员赋值为5的下列表达式中,正确的是( C )。Aa.p=5Ba->p=5Ca.*p=5D*a.p=53Void Set(A&a);是类A中一个成员函数的说明,其中A&a的含义是( A )。A类A的对象引用a作该函数的参数B类A的对象a的地址值作函数的参数C表达式变量A与变量a按位与作函数参数D指向类A对象指针a作函数参数4已知:const A a;其中A是一个类名,指向常对象指针的表示为( D )。Aconst * A pa;Bconst A *pa;CA * const pa;Dconst *pa A;5下列关于子对象的描述中,错误的是( D )。A子对象不可以是自身类的对象B子对象是另一个类的对象C子对象的初始化要包含在构造函数中D一个类中只能有一个子对象6执行下列说明语句,其调用构造函数的次数为( A )。A a5,*p2;其中,A是一个类名A5B6C7D107下列关于运算符new的描述中,错误的是( D )。A它可以创建对象或变量B它可以创建对象数组或一般类型数组C用它创建对象或对象数组时要调用相应的构造函数D用它创建的对象可以不用delete运算符释放8下列关于运算符delete的描述中,错误的是( B )。A使用该运算符可以释放用new运算符创建的对象或对象数组B使用该运算符可以释放所有对象C使用delete运算符时会自动调用析构函数D用它释放对象数组时,它作用的指针名前要加下标运算符 9定义不同存储类对象时,必须要加的存储类说明符是( C )。AautoBexternCstatieDregister10下列关于this的描述中,错误的是( D )。Athis是一个由系统自动生成的指针Bthis指针是指向对象的Cthis指针在用对象引用成员函数时系统创建的Dthis指针只能隐含使用,不能显式使用 7.3 填空题 已知:class A public:A (int i) a=i; void print( ) cont<<a<<endl; private : int a; ;要求:1定义一个指向对象的常指针p,应该是 A *const p; 。2定义一个指向常对象指针p,应该是 A const *p; 。3定义类A的含有5个元素的一维对象数组a,应该是 A a5; 。4定义一个对象指针数组pa,它有5个元素,每个元素是类A对象指针,应该是 A *pa5; 。5使用new创建一个堆对象,一个实参值为5,应该是 A *p; p=new A(5); 。6使用new创建一个对象数组,该数组用指针pa指向,并使数组的3个元素都是类A的对象a1的值。应该是 A a1,*pa; pa=new A3; pa0=pa1=pa2=a1; 。7在某个函数体内定义一个静态类的对象sa,应该是 static A sa; 。8定义一个类A的对象a1,并给它赋值,其实参值为8,应该是 A a1(8); 。7.4 分析下列程序的输出结果1 #include <iostream.h> class A public: A(int i) a=i; A() a=0; cout<<"Default constructor called."<<a<<endl; A() cout<<"Destructor called."<<a<<endl; void Print() cout<<a<<endl; private: int a; ; void main() A a4,*p; int n=1; p=a; for(int i=0;i<4;i+) ai=A(+n); for(i=0;i<4;i+) (p+i)->Print(); 答: Default constructor called. 0 Default constructor called. 0 Default constructor called. 0 Default constructor called. 0 Destructor called. 2 Destructor called. 3 Destructor called. 4 Destructor called. 5 2 3 4 5 Destructor called. 5 Destructor called. 4 Destructor called. 3 Destructor called. 22 #include <iostream.h> class B public: B(int i) b=i; B() b=0; cout<<"Default constructor called."<<b<<endl; B() cout<<"Destructor called."<<b<<endl; void Print() cout<<b<<endl; private: int b; ; void main() B *pb4; int n=1; for(int i=0;i<4;i+) pbi=new B(n+); for(i=0;i<4;i+) pbi->Print(); for(i=0;i<4;i+) delete *(pb+i); 答: 1 2 3 4 Destructor called. 1 Destructor called. 2 Destructor called. 3 Destructor called. 43 #include <iostream.h> class C public: C(int i) c=i; C() c=0; cout<<"Default constructor called."<<c<<endl; C() cout<<"Destructor called."<<c<<endl; void Print() cout<<c<<endl; private: int c; ; void main() C *p; p=new C4; int n=1; for(int i=0;i<4;i+) pi=C(n+); for(i=0;i<4;i+) pi.Print(); delete p; 答: Default constructor called. 0 Default constructor called. 0 Default constructor called. 0 Default constructor called. 0 Destructor called. 2 Destructor called. 3 Destructor called. 4 Destructor called. 5 2 3 4 5 Destructor called. 5 Destructor called. 4 Destructor called. 3 Destructor called. 24 #include <iostream.h> class D public: D() d1=d2=0; cout<<"Default constructor callrd.n" D(int i,int j) d1=i; d2=j; cout<<"Constructor called."<<"d1="<<d1<<','<<"d2="<<d2<<endl; D() cout<<"Destructor called."<<"d1="<<d1<<','<<"d2="<<d2<<endl; void Set(int i,int j) d1=i;d2=j; private: int d1,d2; ; void main() int n(10),m(20); D d4=D(5,7),D(3,6),D(7,9),D(1,4); for(int i=0;i<4;i+) di.Set(n+,m+); 答: Constructor called. d1=5,d2=7 Constructor called. d1=3,d2=6 Constructor called. d1=7,d2=9 Constructor called. d1=1,d2=4 Destructor called. d1=13,d2=23 Destructor called. d1=12,d2=22 Destructor called. d1=11,d2=21 Destructor called. d1=10,d2=205 #include <iostream.h> class E public: E(int i,int j) e1=i; e2=j; cout<<"Constructor called."<<"e1="<<e1<<','<<"e2="<<e2<<endl;