{ return PC==0; } int IsMemberOf(int n); int Add(int n); void Print(); private:
int elems[100],PC; };
int S::IsMemberOf(int n) {
for(int i=0;i int S::Add(int n) { if(IsMemberOf(n)) return 1; else if(PC==100) return 0; else { elems[PC++]=n; return 1; } } void S::Print() { cout<<'{'; for(int i=0;i cout< void main() { S a; cout< for(int i=1;i<=5;i++) b.Add(i); b.Print(); cout< 第 41 页 共 77 页 {} {1,2,3,4,5} 1 0 {1,2,3,4,5,6,7,8,9,10} 6.5 编程题 1.按下列要求编程: (1)定义一个描述矩形的类Rectangle,包括的数据成员有宽(width)和长(length); (2)计算矩形周长; (3)计算矩形面积; (4)改变矩形大小。 通过实例验证其正确性。 答:编程如下: #include 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<<\ cout<<\ } void main() { Rectangle r(5,8); r.Print(); r.Changesize(3,9); r.Print(); } 6. 编程实现一个简单的计算器。要求从键盘上输入两个浮点数,计算出它们的加、减、 乘、除运算的结果。 答:编程如下: #include public: ASMD(double a,double b) { x=a; y=b; } 第 42 页 共 77 页 void Addition() { cout< { cout< { cout< { cout< 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 public: Student(char s[],int gr) { strcpy(name,s); grade=gr; totalize+=gr; } static void Print(); private: char name[10]; int grade; static int totalize; }; int Student::totalize=0; void Student::Print() { cout<<\总成绩为 \平均成绩为 \ } void main() { 第 43 页 共 77 页 Student s1(\ Student::Print(); } 6.6 简单回答下列问题 1. 一个类中是否必须有用户定义的构造函数?如果用户没有定义构造函数,又如何对 创建的对象初始化? 答:一个类用户可以不定义构造函数,这时系统自动提供一个默认的构造函数,并可用该构造函数对创建的对象初始化。 2. 拷贝构造函数具有几个参数?它有类型转换的作用吗? 答:拷贝构造函数具有一个参数,即为该类对象的引用。拷贝构造函数没有类型转换作用。 3. 静态成员属于类的,是否每个对象都可以引用该静态成员? 答:可以。 4. 常对象可以引用非常成员函数吗?非常对象可以引用常成员函数吗? 答:不可以。可以。 5.友元函数能否访问类中的保护成员?友元函数访问类中私有成员与成员函数访问私有成员的形式相同吗? 答:能。相同。 第7章 类和对象(二) 练习题7 7.1 判断题 × 1.定义对象指针时也要调用构造函数。 √ 2.对象指针可用同类对象的地址值给它赋值。 × 3.对象指针成员表示与对象引用相同。 √ 4.常类型指针有两种,一种是指针的地址值是常量,另一种是指针所指向的变量或对象是常量。 × 5.指向对象的常指针的地址值是可以改变的。 × 6.指向常对象的指针所指向的对象是可以改变的。 √ 7.this指针是系统生成的指向当前被某个成员函数操作对象的指针。 × 8.对象引用可以用一个同类对象的地址值对它赋值。 × 9.定义对象引用时,可以对其引用进行初始化,也可以不进行初始化。 × 10.对象数组的元素可以是不同类的对象。 × 11.对象指针数组可以使用不同类的对象的地址值进行初始化。 × 12.给对象数组元素赋值时都要创建临时对象。 √ 13.指向一维对象数组的指针是一个二级指针。 × 14.自身类对象可作该类的子对象。 √ 15.子对象的初始化要在构造函数的成员初始化列表中进行。 √ 16.使用new运算符创建的对象称为堆对象。 √ 17.任何对象都可以使用delete运算符来释放。 × 18.使用new运算符创建的对象数组其元素都具有默认值。 √ 19.类的作用域范围指的是类体内。 × 20.对象的存储类只有外部的和静态的。 7.2 单选题 第 44 页 共 77 页 1.f1()函数是类A的公有成员函数,p是指向类的成员函数f1()的指针,下列表示中正确的是( C )。 A.p=f1() B.p=f1 C.p=A::f1 D.p=A::f1() 2.p是指向类A数据成员a的指针,a是类A的一个对象。在给a成员赋值为5的下列表达式中,正确的是( C )。 A.a.p=5 B.a->p=5 C.a.*p=5 D.*a.p=5 3.Void 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 )。 A.const * A pa; B.const A *pa; C.A * const pa; D.const *pa A; 5.下列关于子对象的描述中,错误的是( D )。 A.子对象不可以是自身类的对象 B.子对象是另一个类的对象 C.子对象的初始化要包含在构造函数中 D.一个类中只能有一个子对象 6.执行下列说明语句,其调用构造函数的次数为( A )。 A a[5],*p[2];其中,A是一个类名 A.5 B.6 C.7 D.10 7.下列关于运算符new的描述中,错误的是( D )。 A.它可以创建对象或变量 B.它可以创建对象数组或一般类型数组 C.用它创建对象或对象数组时要调用相应的构造函数 D.用它创建的对象可以不用delete运算符释放 8.下列关于运算符delete的描述中,错误的是( B )。 A.使用该运算符可以释放用new运算符创建的对象或对象数组 B.使用该运算符可以释放所有对象 C.使用delete运算符时会自动调用析构函数 D.用它释放对象数组时,它作用的指针名前要加下标运算符[ ] 9.定义不同存储类对象时,必须要加的存储类说明符是( C )。 A.auto B.extern C.statie D.register 10.下列关于this的描述中,错误的是( D )。 A.this是一个由系统自动生成的指针 B.this指针是指向对象的 C.this指针在用对象引用成员函数时系统创建的 D.this指针只能隐含使用,不能显式使用 7.3 填空题 已知:class A{ public:A (int i) { a=i;} void print( ) { cont< 要求: 第 45 页 共 77 页