C++的静态绑定
来源:互联网 发布:手机淘宝在哪里看等级 编辑:程序博客网 时间:2024/06/04 19:35
头文件已经正常包含,以下代码在VS IDE上编译和运行结果是
1
2
3
4
5
6
7
8
class
A{
public
:
void
test(){
printf
(
"test A"
);}
};
int
main(){
A*pA=NULL;
pA->test();
}
正确答案: C 你的答案: B (错误)
编译出错
程序运行奔溃
输出"test A"
输出乱码
- 添加笔记
- 求解答(18)
- 收藏
- 纠错
第一,这道题目应该是写法有点问题,应该是这样的(注意类后面加了分号,test后面加了括号)
1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
using
namespace
std;
class
A{
public
:
void
test()
{
printf
(
"test A"
); }
};
int
main(){
A* pA = NULL;
pA->test();
return
0;
}
原因如下:
因为对于非虚成员函数,C++这门语言是静态绑定的。这也是C++语言和其它语言Java, Python的一个显著区别。以此下面的语句为例:
1
pA->test();
找到 pA 的 test 成员函数,调用它。(注意,这里的找到是程序运行的时候才找的,这也是所谓动态绑定的含义:运行时才绑定这个函数名与其对应的实际代码。有些地方也称这种机制为迟绑定,晚绑定。)
但是对于C++。为了保证程序的运行时效率,C++的设计者认为凡是编译时能确定的事情,就不要拖到运行时再查找了。所以C++的编译器看到这句话会这么干:
1:查找 pA 的类型,发现它有一个非虚的成员函数叫 test 。(编译器干的)
2:找到了,在这里生成一个函数调用,直接调A:: test ( pA )。
所以到了运行时,由于 test ()函数里面并没有任何需要解引用 pA 指针的代码,所以真实情况下也不会引发segment fault。这里对成员函数的解析,和查找其对应的代码的工作都是在编译阶段完成而非运行时完成的,这就是所谓的静态绑定,也叫早绑定。
正确理解C++的静态绑定可以理解一些特殊情况下C++的行为。
C应该是正确的。
根据<<深度探索c++对象模型>>里面说到的,普通成员函数在编译器实现时,大致经历一下转化过程:
1.改写函数的签名以安插一个额外的参数 - this指针
2. 将每一个对非静态成员数据成员的存取操作改为经由this指针来存取。
3.将成员函数重写成外部函数,函数名称经过“mangling"处理,使其在程序中有唯一的名字。
(重写成外部函数,是希望在实现成员函数的时候,使其效率接近普通非成员函数,尽可能避免带来额外开销)
------------------------
A*pA=null;
pA->test(); //当调用成员函数时,只是将实参null传给this指针(对应1.)
test成员函数中并无任何需要通过this指针访问的数据成员(对应2.),因此没有带来任何影响
0 0
- [C++]静态绑定与动态绑定
- 【C++】静态绑定和动态绑定
- 参数的静态绑定
- C++的静态绑定
- C++的静态绑定与动态绑定
- c++的动态绑定和静态绑定
- C++的动态绑定和静态绑定
- C++的动态绑定和静态绑定
- java的动态绑定与静态绑定
- java的动态绑定与静态绑定
- java的动态绑定与静态绑定
- java的动态绑定与静态绑定
- C++的动态绑定和静态绑定
- java的动态绑定与静态绑定
- java的动态绑定与静态绑定
- c++的动态绑定与静态绑定
- java的动态绑定 与静态绑定
- java的动态绑定与静态绑定
- Android Patch 方案与持续交付
- STS指定IDE使用JDK
- 在Eclipse中编写servlet时出现"The import javax.servlet cannot be resolved" 问题解决办法
- zzulioj 1902 (985的因子对难题)
- opengl es坐标变换2
- C++的静态绑定
- 数据结构实验之串二:字符串匹配
- MySQL学习笔记——MySQL性能优化方法简述
- QwtArrowButton,QwtSystemClock,QwtPlotPanner类参考from Qwt6.1.1
- 理解WPF中的视觉树和逻辑树
- Beyond Compare生成表格比较报告的方法
- 性能优化
- 使用网络服务发现(无线连接设备)——翻译自developer.android.com-Trainning
- EditText怎么设置可点击不可编辑