August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
一如以往,我们必须要保证在使用对象之前为它赋一个值;也就是说,我们希望确保指针被初始化,并且指向的对象也被初始化。考虑下面代码:
显然,声明p0但没有对它进行初始化会带来麻烦。考虑下面代码:
这行代码将7.0赋给内存中的某个位置,但我们并不知道将会是哪部分内存。这个赋值可能是无害的,但是永远也不要这样做。我们迟早会得到与越界访问相同的结果:“我的程序神秘崩溃”或“我的程序得到错误的输出”。对于老式C++程序(“C风格程序”),大多数严重错误是由未初始化指针的访问或越界的访问而引起。我们必须尽最大努力去避免这种访问,部分原因是着眼于专业化,部分原因是我们不想浪费时间查找这种错误。很少有事情像查找这种错误一样令人沮丧和厌倦。避免错误而不是查找它更令人愉快和有效率。
对于内置类型,使用new分配的内存不会被初始化。如果想初始化单个对象,你可指定一个值,就像我们对p2所做的:*p2=5.5。注意{}初始化语法。它与[]相对,后者表示“数组”。
对new分配的对象数组,我们可以指定一个初始化器列表。例如:
现在,p4指向5个double类型的变量,它们的值为0.0、1.0、2.0、3.0和4.0。p5也是如此;如果提供了一组元素作为初始值,我们可以省略元素数目。
像往常一样,我们应该小心未初始化的对象,确保在读取它们之前已为它们赋值。注意,编译器通常有一个“调试模式”,每个变量被默认初始化为一个预期值(通常为0)。这意味着当关闭调试模式并发布一个程序时、当用优化器优化程序时或者只是在不同机器上编译时,带有未初始化变量的程序可能突然有不同的运行结果。不要陷入未初始化变量的麻烦中。 ...