从全局函数与成员函数区别来探讨c++深层原理
(2012-08-14 13:33:27)
标签:
杂谈 |
分类: C |
对一门语言来说,函数是个执行单元,如果,你想让你系统更加清晰,具有扩充性,对函数相关参数的定义是必不可少的,而影响这个结果还有我们对语言中函数的理解度。
我们知道,编译器会将我们的代码翻译成相应的机器指令,而他在我们进行函数调用时,会就很多其他的事情:
编译器遇到全局函数和类成员函数的处理是不是相同,很显然是不同,首先,他规定了不同的调用方法。成员方法需要用一个实例来调用,这样的做的方法是因为成员函数需要传入this(对象指针),理解这点,我想你会对很多问题有比较深的看法。
类成员方法有个默认的输入参数,就是该对象的一个指针。在c++中你调用一个成员函数有两中方法:1.实例化一个对象:A a;2.定义一个该类的指针并new()。
Void show(){cout<<”show”<<endl;}
编译器在遇到show()时,就知道这是个函数调用,并在把show()函数的首地址放入ip中。 并且做一些准备,为调用这个函数。所以,我们要是得到这个地址,并也告诉编译器这个地址是个函数地址,当我执行这个地址时,编译器自然也会去执行我们的函 数,这样我们就可以执行类的私有成员函数了,如果理解了点,你就会把工作区分的很清除了,了解编译器的本质了。最能说明这个问题的是函数的虚拟表了。
这里,就来探讨下this指针的本质以及编译器用他来完成的动态编译(多态性)。看下面这段普通的代码:
#include<iostream>
using namespace std;
class A{public:
{cout<<”A is show”<<endl;}
};
{public:void show(){cout<<”B is show”<<endl;}}
我们知道结果是B is show;也知道这是因为c++的多态机制造成了,但说完这些,你还能说些东西关于这个程序吗?你能大约描叙这个程序对应机器码吗?如果,不能这说明你对c++的多态还不是很了解,这样是很少在高层设计上灵活运用的。
上面说过,调用成员函数的两种方法,这属于第二种,a是个指针,是个A类型的,所以,你用他去调用show()方法,编译器是让过的,因为他发现你在A里面有show()这个方法,但当他发现这是个virtual 函数,所以,他就要得到此时调用这个函数的this指针。A的值是一个B对象的地址,很显然编译器用的也就是B的虚拟表了。而B的虚拟表是有show()方法的,所以,编译器在给我们翻译时就是按这个过程来的,而b的位置要运行时才可以确定,所以叫动态编译。
上面这个分析,至少可以让我们回忆和解释以下我们熟知的知识点:
1.
2.
3.