高质量程序设计指南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的用意。

posted on 2013-04-27 21:40  江在路上2  阅读(171)  评论(0编辑  收藏  举报