9.9 练习

部分练习题的答案可以在本书的电子文档“Annotated Solution Guide for Thinking in C++”中找到,只需支付很少的费用就可以从http://www.BruceEckel.com得到这个电子文档。

9-1 写一个使用本章开头出现的F()宏的程序,证明它就像本章中所说的那样不能进行正确地扩展,修改宏并使程序能正确运行。

9-2 写一个使用本章开头出现的FLOOR()宏的程序,说明它在什么情况下不能正常运行。

9-3 修改MacroSideEffects.cpp,使BAND()能够正常运行。

9-4 创建两个功能相同的函数f1()和f2(),f1()是内联函数,f2()是非内联函数。使用<ctime>中的标准C库函数clock()标记这两个函数的开始点和结束点,比较它们看哪一个运行得更快,为了得到有效的数字,也许需要在计时循环中重复调用这两个函数。

9-5 对练习4中的函数代码的复杂性和大小作一下试验,看看对于内联函数和非内联函数在时间的消耗上,能否找到一个平衡点。如果可能,再在不同的编译器上试一试,并注意它们之间的差异。

9-6 证明内联函数默认为内部连接。

9-7 创建一个类,它包含一个整型数组。增加一个内联构造函数和一个内联成员函数print()。内联构造函数使用标准的C库函数memset()初始化对应于构造函数的参数(默认时为零)的数组,内联成员函数print()打印数组所有元素值。

9-8 把第5章中的例子NestFriend.cpp中的所有成员函数改成内联函数,并使它们为非insitu内联函数,也对于构造函数改造initalize()函数。

9-9 使用内联函数修改第8章中的StringStack.cpp。

9-10 创建一个称为Hue的enum,它包含red、blue和yellow。创建一个color类,该类包含一个Hue类型的数据成员,其构造函数用参数设置这个数据成员的值。增加访问函数用来获取和设置Hue这个数据成员的值,注意所有的函数都使用内联函数。

9-11 使用访问器和修改器的方法修改练习10中的程序。

9-12 修改程序Cpptime.cpp,使它从程序开始运行时开始计时,直到用户按确认(Enter)键或者回车键(Return)。

9-13 创建一个类,它带有两个内联成员函数,在类中定义的第一个成员函数调用第二个成员函数,而不需要提前声明。写一个主函数创建类的对象并调用第一个成员函数。

9-14 创建一个类A,它带有一个能声明自己的内联的默认的构造函数,再创建一个新类B,将A的一个对象作为B的成员,B的构造函数也是内联的,创建一个B类的对象数组,执行程序看看会出现什么情况。

9-15 从以前的练习的类中创建大量的对象并使用Time类来计算非内联构造函数和内联构造函数之间的时间差别(假如有剖析器(profiler),也试着使用它。)

9-16 写一个带有一个string命令行参数的程序,写一个for循环,循环每执行一步就去掉string的一个字母并使用本章的DEBUG()宏打印string。

9-17 正确地修改TRACE()宏,使它成为本章所指定的特定宏,并使它能正确运行。

9-18 修改FIELD()宏,使它含有一个索引(index)号,创建一个类,它的成员由一些对FIELD()宏的调用组成,增加一个成员函数,它允许使用索引号查看域,写一个主函数main()测试这个类。

9-19 修改FIELD()宏,使它自动产生对每一个域访问的访问函数(数据应该仍旧是私有的)。创建一个类,它的成员由一些对FIELD()宏的调用组成,写一个主函数main()测试这个类。

9-20 写一个程序,它带两个命令行参数:第一个参数是一个整数,第二个参数是一个文件名,使用require.h以确保参数数目正确,并且整数在5到10之间,文件能够被成功地打开。

9-21 写一个使用IFOPEN()宏的程序,用它来打开一个文件并作为一个输入流,注意ifstream对象的创建以及它的作用域。

9-22 (高级)看看你的编译器怎样产生汇编代码。创建一个文件,它包含一个很小的函数和main()函数,main()调用这个小函数,分别产生这个小函数是内联和非内联时的汇编代码,证明内联版本比非内联版本的函数调用的开销要小。