8.2.3 赋值和类型检查

C++关于类型检查是非常精细的,这一点也扩展到指针赋值。可以把一个非const对象的地址赋给一个const指针,因为也许有时不想改变某些可以改变的东西。然而,不能把一个const对象的地址赋给一个非const指针,因为这样做可能通过被赋值的指针改变这个对象的值。当然,总能用类型转换强制进行这样的赋值,但是,这是一个不好的程序设计习惯,因为这样就打破了对象的const属性以及由const提供的安全性。例如:

8.2.3 赋值和类型检查 - 图1

虽然C++有助于防止错误发生,但如果程序员自己打破了这种安全机制,它也是无能为力的。

8.2.3.1 字符数组的字面值

没有强调严格的const特性的地方,是字符数组的字面值。也许有人可以写:

8.2.3 赋值和类型检查 - 图2

编译器将接受它而不报告错误。从技术上讲,这是一个错误,因为字符数组的字面值(这里是“howdy”)是被编译器作为一个常量字符数组建立的,所引用该字符数组得到的结果是它在内存里的首地址。修改该字符数组的任何字符都会导致运行时错误,当然,并不是所有的编译器都会做到这一点。

所以字符数组的字面值实际上是常量字符数组。当然,编译器把它们作为非常量看待,这是因为有许多现有的C代码是这样做的。当然,改变字符数组的字面值的做法还未被定义,虽然可能在很多机器上是这样做的。

如果想修改字符串,就要把它放到一个数组中:

8.2.3 赋值和类型检查 - 图3

因为编译器常常不强调它们的差别,所以可以不使用后面这种形式,在这一点上已变得无关紧要了。