3.6.5 代码分析(2)
我们可以看到logToFile成员函数拥有相当多的代码,通常它本不应成为一个内联函数。在本例中之所以这样做,是因为我们将所有的函数都放到Task类声明当中定义,以方便客户程序使用。
在logToFile成员函数的函数体中,if语句检查task的结束时间与起始时间是否相同。如果相同,将task结束时间设置为当前时间。在第2章中,我们曾经通过调用ofstream的open成员函数来打开一个文件,这里我们使用构造函数来完成同样的操作:
这和先定义对象,再调用open成员函数是一样的:
ofstream拥有众多的构造函数和open成员函数的重载版本。此处我们用的是带两个参数的构造函数,第一个参数是用C风格字符串表示的文件名,我们使用string的c_str成员函数将string类型字符串转变为所需类型。第二个参数是指文件的打开模式,本例我们使用ios::app,表示用追加模式打开文件。追加模式,是指写入的信息将追加到文件的结尾。表3-1列出了各种文件打开模式及其含义。
表3-1 文件打开模式
在成员函数logToFile中,ofstream对象outfile的生存范围是logToFile的函数体。因此,当logToFile退出时,outfile对象被摧毁从而自动调用其析构函数,而该析构函数会关闭打开的文件流。因此,本例中对outfile对象作出的close调用是多余的。之所以这样做,是为了对关闭文件流这个操作进行强调。
为防止程序员忘了在Task对象被摧毁之前调用logToFile函数,Task类在其析构函数中调用该函数,以确保任何任务的信息都输出到日志文件当中。
在下面的代码段中:
对象t2的析构函数在超出其所处的程序段时被调用,对象t1的析构函数则在main函数退出时被调用,并将输出信息至日志文件。