面向对象程序设计及C++实验指导(第3版)
上QQ阅读APP看书,第一时间看更新

第4章 类与对象的知识进阶

1.例4-2的思考题:

①在例4-2中,Croster类的Display()函数调用了对象成员所属类的成员函数Display()完成对对象成员的输出,能否直接用

来输出年份呢?为什么?

②若已经定义了一个对象:“CDate birth(2000,1,2);”,要用birth来定义一个Croster类对象stuB:“Croster stuB("赵焱", birth);”应怎样设计构造函数?

【分析与解答】①不可以。因为Date_Year是CDate类型的私有数据成员,具有隐藏信息的功能,不对外公开,birthday是CDate类的对象,对象不可以直接访问私有属性成员。

②因为是用一个已存在的对象来创建新的Croster类对象,需要添加重载构造函数,代码如下。

2.例4-3的思考题:

①请将li04_03_roster.cpp中的语句“int Croster::Count=100;”删除或注释掉,重新编译程序,观察结果并解释原因。

②若例4-3中静态数据成员Count设计为private属性,重修编译程序,观察结果并解释原因。

【分析与解答】①将初始化Count的语句删除或注释掉,重新编译,系统会提示2个链接错误。

说明静态数据成员必须在类外进行初始化。

②如果将静态数据成员作为私有成员来定义,重新编译程序,会出现多个错误提示,提示的是同一条错误信息。

这是因为“类名::静态数据成员”或“对象。静态数据成员”的前提条件是Count应当为公有属性成员。

3.例4-4的思考题:

能否将程序li04_04_main.cpp中的语句“list[1].Display();”改为“Croster::Print();”,编译链接并运行程序,观察结果并解释原因。

【分析与解答】将程序li04_04_main.cpp中的语句“list[1].Display();”改为“Croster::Print();”,编译链接并运行程序,结果与原来完全相同。原因很简单,在对象存在的情况下,对Sum这个公有静态数据成员,用类名或对象名直接访问都是正确的。

4.例4-6的思考题:

若构造函数采用如下形式。

重新编译,观察显示的信息并解释。

【分析与解答】无法通过编译,显示错误信息。

因为Score是类中的常数据成员,只能通过初始化列表完成初始化。

5.例4-7的思考题:

①如果删除li04_07_roster.h中的“void Display()”函数声明和对应li04_07_roster.cpp中的函数实现,编译运行程序并观察结果。

②恢复原来的程序,然后将本例中的“void Display()const;”函数声明和对应li04_07_roster.cpp中的函数实现删除,其余代码不变,重新编译,观察结果。

【分析与解答】①删除普通成员函数Display(),程序仍可正确通过,只是运行结果的第4行变为:“This is void Display()const.”。这表明此时普通的对象也是调用了常成员函数。普通对象调用同名成员函数的顺序:如果函数没有重载,则调用该唯一的函数,无论它是否是常成员函数;如果函数有常成员函数和普通成员函数的重载,则优先调用普通成员函数。

②删除常成员函数“void Display()const;”,重新编译,有一条错误信息。

因为常对象只能调用常成员函数,而不能调用普通成员函数,这是为了保证不改变对象的任何数据成员。