7.7 练习

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

7-1 创建一个包含一个string对象的Text类,来保存一个文件的内容。写两个构造函数:一个是默认的构造函数,另一个构造函数带有一个string参数,它是要打开的文件的名字。当使用第二个构造函数时,打开这个文件并把内容读到string成员对象中。增加一个成员函数contents()用来返回string,以便可以打印。在main()函数中,使用Text打开一个文件并打印该文件的内容。

7-2 创建一个Message类,其构造函数带有一个string型的默认参数。创建一个私有成员string,在构造函数中只是简单地把参数string赋值给内部的string。创建两个重载的成员函数print():一个不带参数,而只是显示存储在对象中的信息;另一个带有string型参数,它将显示该字符串加上对象内部信息。比较这种方法和使用构造函数的方法,看哪种方法更合理?

7-3 确定您的编译器是怎样产生汇编输出代码的,并运行实验以观察名字修饰表。

7-4 创建带有4个成员函数的类,4个成员函数分别带有0、1、2、3个int参数。创建main()函数,产生你的类对象并调用每一个成员函数。然后修改类,使它只有一个成员函数,并且都使用默认参数。你的main()函数需要改变吗?

7-5 创建带有两个参数的函数,在main()中调用它。然后让一个参数作为“占位符”(没有标识符),看看main()中的调用是否改变。

7-6 用默认参数修改Stash3.h和Stash3.cpp中的构造函数,创建两个不同的Stash对象来测试构造函数。

7-7 创建一个新的Stack类(见第6章),默认构造函数如前面所述,还有第二个构造函数,它的参数是指向对象的指针数组和数组的大小。该构造函数应该遍历数组并把指针压入Stack中,用一个string数组测试你的程序。

7-8 修改SuperVar以便在所有vartype代码前有#ifdef,描述见前面关于enum的章节。让vartype成为一个常规的public枚举类型(没有实例),修改print(),使得它要求vartype参数能告诉它做什么。

7-9 实现Mem2.h,确保修改的类仍旧能与MemTest.cpp一起工作。

7-10 使用Mem类来实现Stash。注意:由于该实现是private,因此用户看不到,测试代码不必修改。

7-11 在Mem类中,增加一个bool类型的成员函数moved()。它引用pointer()的结果,告诉指针是否已经移动(由于被重新分配)。写一个main()函数来测试moved()函数。每次需要访问Mem中的内存时,是使用像moved()这样的函数好,还是简单地调用pointer()好?