面向对象VS过程性
与传统的过程性编程不同,面向对象强调的是在运行阶段,而不是编译阶段(即编译器将程序组合起来时)进行决策。书中将运行阶段和比做度假时,选择参观哪些景点取决于天气和当时的心情;而编译阶段决策更像不管在什么条件下,都坚持预先设定的日程安排。
运行阶段决策提供了灵活性,可以根据当时的情况进行调整。
实际编程中,当初始化数组时,传统方法要指定数组的长度,这就是编译阶段决策。提前决策有可能带来资源浪费,一种情况下绝大多数时候,包含20个元素的数组足够了,但程序有时需要处理200个元素。这样初始化数组的长度必须大于200,导致程序在大多数情况下都浪费了内存。
面向对象将这样的决策推迟到运行阶段进行,使程序更灵活。在程序运行后,使用关键字new请求正确数量的内存以及使用指针来跟踪新分配的内存的位置。可以这次告诉它只需要20个元素,而还可以下次告诉它需要205个元素。
在运行阶段做决策并非面向对象独有的,但使用C++编写这样的代码比使用C语言简单。
指针和const
const有两种方式来修饰指针,分别是 (const * typename)和 (typename * const)。前者是指针指向一个常亮对象,不允许通过该指针修改修饰的变量;后者是将指针本身申明为常量,防止改变指针指向的位置。
// 指向const的指针
int a = 16;
int b = 8;
const * int p = &a;
*p++; //禁止修改p指向的值
*p = 10; //禁止修改p指向的值
p = &b; //允许p指向另一个变量
// const指针
int a = 16;
int b = 8;
int * const p = &a;
*p++; //允许修改p指向的值
*p = 10; //允许修改p指向的值
p = &b; //禁止p指向另一个变量
尽可能使用const
应尽量将指针参数声明为指向常量的数据,因为:
- 避免函数调用时修改数据;
- 可以处理传入的参数是const和非const两种情况,否则只能接受非const数据。