读取未初始化的值会导致不明确的行为。在某些平台上,仅仅只是读取未初始化的值,就可能让你的程序终止运行。更可能的情况是读入一些“半随机”bits,污染了正在进行读取动作的那个对象,最终导致不可预知的程序行为,以及许多令人不愉快的调试过程。
- 对于内置类型的对象手动初始化
- 对于内置类型以外的任何其他东西,初始化责任落在构造函数身上。
但要区别赋值和初始化。对象的成员变量的初始化动作发生在进入构造函数本体之前。
在上述代码中,theName,theAddress和thephones都不是被初始化,而是被赋值。初始化的发生时间更早,发生于这些成员的默认构造函数被自动调用时(比进入ABEntry构造函数本体的时间更早)。但这对numTimesConsulted不为真,因为它属于内置类型,不保证一定在你所看到的那个赋值动作的时间点之前获得初值。
ABEntry构造函数的一个较佳写法是,使用初始化成员列表替换赋值动作:
这个构造函数效率更高。基于赋值的那个版本首先调用默认构造函数为theName,theAddress和thePhones设初值,然后立刻再对它们赋予新值。默认构造函数的一切作为就因此浪费了。成员初始化列表避免了这一问题。因为初始化列表中针对各个成员变量而设的实参,被拿去作为各成员变量之构造函数的实参。本例中的theName以name为初值进行copy构造,theAddress以address为初值进行copy构造,thePhones以phones为初值进行copy构造。
对大多数类型而言,比起先调用默认构造函数然后再调用copy assignment操作符,单只调用一次copy构造函数时比较高效的。对于内置型对象,其初始化和赋值的成本相同,但为了一致性最好也通过成员初始化列表来实现。
时间: 2024-10-07 19:27:06