(一)首先来看看const 常量相关的编译时与运行时: C++ const 常量不同于有些语言,可以是编译时常量,也可以是运行时常量。
运行结果
- int func()
- {
- int x=0,y=1;
- return x+y;
- }
- int main()
- {
- const int i = 0;
- int * p = ( int *)&i;
- *p =1;
- int j = *p;
- const int k = func();
- cout<<"i=" <<i<< " j=" <<j<< " k=" <<k<<endl;
- return 0;
- }
上边代码中指针p与 const 常量 i 的地址相同,通过 p 改变了该地址的值,但是从输出结果可以看到 i 仍然是 0 而 j 成为 1 ,这就是所谓的编译时常量,程序在编译时都已经将 i 替换为 0 ,所以后续运行时的改变不会影响 i 的输出,这也是编译器优化技术中的常量折叠:在编译阶段,对该变量进行值替换,同时,该常量拥有自己的内存空间,并非像宏定义一样不分配空间;而另一个 k 则是运行时常量,因为 k 的值只用在执行了函数 func() 之后才能得到。
(二)再来看看跟多态相关的编译时与运行时:C++中多态分为两种,编译时多态和运行时多态,编译时多态主要指函数重载以及运算符重载等,而运行时多态主要指通过指针或引用调用虚函数达到动态绑定。注意运行时的多态只能通过虚函数的继承以及指针或者引用去调用才会实现,普通的函数、对象而不是指针或引用调用将不会起作用。(转)