高质量程序设计指南c++/c语言(15)--编译时和运行时的不同
我们把编译预处理器、编译器和连接器工作的阶段合成“编译时”。语言中有些构造仅仅在编译时起作用,而有些构造是在“运行时”起作用的,分清楚这些构造对于程序设计很重要。例如,预编译伪指令、类定义、外部对象声明、函数原型、标识符、各种修饰符号(const、static)及类成员的访问说明符和连接规范、调用规范等,仅在编译器进行语法检查、语义检查和生成目标文件及连接的时候起作用的,可在执行程序中不存在这些东西。容器越界访问、虚函数动态决议、函数动态连接、动态内存分配、异常处理和RTTI则是在运行时才会出现和发挥作用的。举两个例子:
(1)
#include<iostream> using namespace std; int main(void) { int *pInt = new int[10]; pInt += 100; cout << *pInt << endl; *pInt = 1000; return 0; }
编译绝对没问题,但是运行时可能发生悲剧。
(2)
#include<iostream> using namespace std; class Base { public: virtual void f() { cout << "Base::f" << endl; } }; class Derived:public Base { private: virtual void f() { cout << "Derived::f" << endl; } }; int main(void) { Base *p = new Derived; p->f(); return 0; }
编译时和运行时都没有出错,但是却违背了private的用意。