13.6 无用计算
延迟计算是指那些不总是必须执行的计算,至于哪些计算是必须执行的与程序的执行流程有关,而无用计算是指那些根本无须执行的计算。无论执行流程如何,这些计算结果从不使用,因此它们是完全没有意义的。
一个关于无用计算的精妙例子是成员对象的无用初始化。
- class Student {
- public:
- Student(char *nm);
- ...
- private:
- string name;
- };
Student类构造函数将输入的字符指针转换成一个代表学生姓名的string对象:
- Student::Student(char *nm)
- {
- name = nm;
- ...
- }
C++(www.cppentry.com)保证在Student的构造函数体执行之前,所有的成员对象已经创建完成,此处即string型的name对象。既然我们没有显式地告诉编译器如何构造它,编译器就插入了对string默认构造函数的调用。该调用在Student的构造函数体执行之前进行。在构造函数体之后执行以下代码:
- name = nm;
该赋值操作实际上清除了name对象之前的内容。我们从未使用过编译器调用的string默认构造函数的结果。通过在Student的构造函数初始化列表中显式指明string构造函数,可以避免这种无效计算:
- Student::Student(char *nm) : name(nm) //
string显式构造函数 - {
- ...
- }
由于我们明确告诉编译器使用哪个string构造函数,编译器将不再隐式地调用string默认构造函数[Mey97]。因此我们实现了一步完成string成员对象的构造。