我们把编译预处理器、编译器和连接器工作的阶段合成“编译时”。语言中有些构造仅仅在编译时起作用,而有些构造是在“运行时”起作用的,分清楚这些构造对于程序设计很重要。例如,预编译伪指令、类定义、外部对象声明、函数原型、标识符、各种修饰符号(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的用意。
原文链接: https://www.cnblogs.com/zzj3/archive/2013/04/27/3048092.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/86210
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!