ITEEDU

自测练习

7.1 填空:

a)——语法用于初始化类的常量成员。

b)成员函数应声明为类的——才能访问这个类的private数据成员。

c)——运算符对指定类型对象动态分配内存并返回该类型的——。

d)常量对象应——,不能在生成之后修改。

e)——数据成员表示类范围信息。

f)对象的成员函数能访问对象的“自我指针”,称为——指针。

g)关键字——指定对象或变量初始化之后不可修改。

h)如果类的成员对象不提供成员初始化值,则调用该对象的——。

i)如果成员函数不访问——类成员.则可以声明为static。

j)成员对象在所在类对象之——构造。

k)——运算符删除前面用new分配的内存。

7.2找出下列各题的错误并说明如何纠正:

 a) class Example {
    public:
          Example{ int y = 10 ) { data = y; }
          int getIncrementedData() const { return ++data; }
          static int getCount()
          {
               cout << "Data is "<< data << endl;
               return count;
          }
          private:
               int data;
               static int count;
b) char *string;
    string = new chaar[ 20 ];
    free( string );

自测练习答案

7.1 a)成员初始化值。b)友元。c)new、指针。d)初始化。e)static。f)this。g)const。h)默认构造

函数。i)非static。j)前。k)delete。

7.2 a)不正确:Exsample的类定义有两个错误。第一个在getIncrementedData函数中,函数声明为const,但其修改对象。

纠正:要纠正第一个错,删除getIncrementedData定义中的const关键字。

不正确:第二个错在getCount函数中。函数声明为static,因此不能访问类的非static成员。

纠正:要纠正第二个错,删除getCount定义中的输出行。

b)不正确:new动态分配的内存用C标准库函数free删除。

纠正:用C++的delete运算符释放内存。C语言式动态内存分配运算符不能与C++的

new和delete运算符混用。

练 习

7.3 比较C++的new和delete运算符动态内存分配与C标准库函数malloc和free运算符动态内存分配。

7.4 说明C++友元关系的概念,说明友元关系的副作用。

7.5 正确的Time类定义能否同时包括下列构造函数如果不能,为什么

Time( int h = 0, int m = 0, int s= 0 );

Time();

7.6 构造函数或析构函数指定返回类型(即使void)时,会发生什么情况

7.7用下列条件生成Date类:

a)用多种格式输出日期,例如:

DDD YYYY

MM/DD/YY

June 14,1992

b)用重载的构造函数生成Date对象,用a)中的日期格式初始化。

c)生成一个Date构造函数,用time.h头文件的标准库函数读取系统日期和设置Date成员。

第8章将介绍如何生成运算符,测试两个日期的相等性和比较两个日期的前后顺序。

7.8 生成一个SavingsAceount类。用static数据成员包含每个存款人的annualInterestRate(年利率)。类的每个成员包含一个private数据成员savingsBalanee,表示当前存款额。提供一个calculateMontMyInterest成员函数,计算月利息,用balanee乘以annuaUnlterestRate除以12取得,并将这个月息加进savingsBalance中。提供一个static成员函数

modifyInterestRate,将static annualInterestRate设置为新值。实例化两个不同的SavingsAecount对象saver1和savver2,结余分别为2000.00和3000.00。将annualInterestRate设置为3%,计算每个存款人的月息并打印新的结果。然后将annualInterestRate设置为4%,再次计算每个存款人的月息并打印新的结果。

7.9 生成一个IntegerSet类。IntegerSet类的每个对象可以保存0到100之间的整数值。一个集合内部表示为0和1的数组。数组元素a[i]为1表示整数i在集合中,数组元素a[j]为0表示整数j不在集合中。默认构造函数将集合初始化为“空集”,即所有元素都是0。

提供常用集合操作的成员函数。例如,提供一个unionOfIntegerSets成员函数,生成两个现有集合的并集(即只要其中一个集合的元素为1,则并集的元素就是1,如果两个集合的元素均为0,则并集的元素就是0)。

提供intersectionOfIntegerSets成员函数生成两个现有集合的交集(即只要其中一个集合的元素为0,交集的元素就是0,如果两个集合的元素均为1,则交集的元素就是1)。

提供一个insertElement成员函数,在集合中插入新整数k(将a[k]设置为1)。提供deleteElement删除整数m(将a[m]设置为0)。

提供一个setPrint成员函数,将集合表示的值打印为以空格分隔的列表,只打印集合中存在的元素(即对应值为1的位置),空集打印———。

提供一个isEqualTo成员函数,确定两个集合是否相等。

提供其他构造函数,取五个整数参数,可以初始化一组对象。如果提供的元素不到五个,其他元素用默认参数-1。

编写一个驱动程序,测试IntegerSet类。实例化几个integerSet对象。测试所有成员函数能否正确工作。

7. 10 图7.8的Time类可以在内部将时间表示为从午夜算起的秒数而不是三个整数值hour、minute和second。客户可以用相同的public方法并取得相同结果。修改图7.8的Time类,将时间表示为从午夜算起的秒数,证明类的客户看不到功能性的变化。