13.6 无用计算

2013-10-07 14:06:24 · 作者: · 浏览: 58

13.6  无用计算

延迟计算是指那些不总是必须执行的计算,至于哪些计算是必须执行的与程序的执行流程有关,而无用计算是指那些根本无须执行的计算。无论执行流程如何,这些计算结果从不使用,因此它们是完全没有意义的。

一个关于无用计算的精妙例子是成员对象的无用初始化。

  1. class Student {  
  2. public:  
  3.     Student(char *nm);  
  4.     ...  
  5. private:  
  6.     string name;  
  7. }; 

Student类构造函数将输入的字符指针转换成一个代表学生姓名的string对象:

  1. Student::Student(char *nm)  
  2. {  
  3.     name = nm;  
  4.     ...  

C++(www.cppentry.com)保证在Student的构造函数体执行之前,所有的成员对象已经创建完成,此处即string型的name对象。既然我们没有显式地告诉编译器如何构造它,编译器就插入了对string默认构造函数的调用。该调用在Student的构造函数体执行之前进行。在构造函数体之后执行以下代码:

  1. name = nm

该赋值操作实际上清除了name对象之前的内容。我们从未使用过编译器调用的string默认构造函数的结果。通过在Student的构造函数初始化列表中显式指明string构造函数,可以避免这种无效计算:

  1. Student::Student(char *nm) : name(nm) //
    string显式构造函数  
  2. {  
  3.     ...  

由于我们明确告诉编译器使用哪个string构造函数,编译器将不再隐式地调用string默认构造函数[Mey97]。因此我们实现了一步完成string成员对象的构造。