![面向对象程序设计及C++实验指导(第3版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/255/43696255/b_43696255.jpg)
第4章 类与对象的知识进阶
1.例4-2的思考题:
①在例4-2中,Croster类的Display()函数调用了对象成员所属类的成员函数Display()完成对对象成员的输出,能否直接用
![](https://epubservercos.yuewen.com/56F797/22987383301138006/epubprivate/OEBPS/Images/015-4-i.jpg?sign=1739061990-MVQYAPeoYcDE1GLX9Hpk2eoRVz3xasVc-0-8b35620fcfdcc82a06cb13e4e4c13cd0)
来输出年份呢?为什么?
②若已经定义了一个对象:“CDate birth(2000,1,2);”,要用birth来定义一个Croster类对象stuB:“Croster stuB("赵焱", birth);”应怎样设计构造函数?
【分析与解答】①不可以。因为Date_Year是CDate类型的私有数据成员,具有隐藏信息的功能,不对外公开,birthday是CDate类的对象,对象不可以直接访问私有属性成员。
②因为是用一个已存在的对象来创建新的Croster类对象,需要添加重载构造函数,代码如下。
![](https://epubservercos.yuewen.com/56F797/22987383301138006/epubprivate/OEBPS/Images/016-i.jpg?sign=1739061990-8ryiigtGxJkRmt5D0WkbfPfcHyCZrqz3-0-f4925f6cd90e8eaf133a4f767917ff11)
2.例4-3的思考题:
①请将li04_03_roster.cpp中的语句“int Croster::Count=100;”删除或注释掉,重新编译程序,观察结果并解释原因。
②若例4-3中静态数据成员Count设计为private属性,重修编译程序,观察结果并解释原因。
【分析与解答】①将初始化Count的语句删除或注释掉,重新编译,系统会提示2个链接错误。
![](https://epubservercos.yuewen.com/56F797/22987383301138006/epubprivate/OEBPS/Images/016-2-i.jpg?sign=1739061990-760NTktKpDEhPm9DpaN7Jr0lWd9lVD7L-0-4d0b86e4de1ccd819ee2963e590f2507)
说明静态数据成员必须在类外进行初始化。
②如果将静态数据成员作为私有成员来定义,重新编译程序,会出现多个错误提示,提示的是同一条错误信息。
![](https://epubservercos.yuewen.com/56F797/22987383301138006/epubprivate/OEBPS/Images/016-3-i.jpg?sign=1739061990-ylZ0aBVJ2eVJG33hB741XPG6SkOqZeUN-0-0fba922795e1cddb6da692e4c9564e76)
这是因为“类名::静态数据成员”或“对象。静态数据成员”的前提条件是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的思考题:
若构造函数采用如下形式。
![](https://epubservercos.yuewen.com/56F797/22987383301138006/epubprivate/OEBPS/Images/016-4-i.jpg?sign=1739061990-lu67d33VWuLfsiQoYUR0UaiHV080lJ6w-0-97a3fae0fd1e20795dd0085033ff7540)
重新编译,观察显示的信息并解释。
【分析与解答】无法通过编译,显示错误信息。
![](https://epubservercos.yuewen.com/56F797/22987383301138006/epubprivate/OEBPS/Images/016-5-i.jpg?sign=1739061990-BiUEuwJit8gzeRjXQsBJhM9r7tRvMeI6-0-b671ad48e0dd85b7049561d2fee6c23f)
因为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;”,重新编译,有一条错误信息。
![](https://epubservercos.yuewen.com/56F797/22987383301138006/epubprivate/OEBPS/Images/017-i.jpg?sign=1739061990-j9H6orce07ZwzJ1RBmVrDQljI2OFBgRG-0-a3e3c9817b630b7ee4407d692b0f7e09)
因为常对象只能调用常成员函数,而不能调用普通成员函数,这是为了保证不改变对象的任何数据成员。