C++ 类成员函数是如何被调用的

C++ 类成员函数是如何被调用的

以下是转载,整理了下一

struct foo{ int val; void bar( void ) { cout << val << endl; }};foo a;a.bar();你可以看成是:struct foo{ int val;};void bar( foo& obj ){ cout << obj.val << endl;}foo a;bar( a );

基本上可以按照上面的理解,成员函数不占有类的空间,也就是说这些成员函数只是我们程序员与编译器之间的约定而已,编译器与机器码之间没有成员函数与一般的函数之分,所有的成员函数都会被编译成为一般的全局性的函数(就如楼上所说的形式),成员的约定只是用于编译器判断那些对象可以调用那些函数而已,在调用的时候编译器只要把调用语句编译成跳转到该“成员”函数的地址即可,没有必要把这个指针放到类中。但虚拟的成员函数就不一样,它需要占用类一定的空间,你可以把你自己所说的类中的成员函数改成一个虚拟的成员函数,你就会发现类的存储空间变成一个指针的大小了,但当你再类中添加多个虚拟的成员函数,类的大小并不会按照指针的个数增长,而是维持在一个指针的大小,至于为什么这样我就不太清楚了。如果你不明白为什么虚拟的成员函数需要占用类的空间,而非虚拟的成员函数不需要的话,简单的基本原理我可以讲一下,而且我觉得,如果联合起来思考更容易理解。因为非虚拟的成员函数在编译阶段就可以确定函数的地址,所以它没有必要占用类的空间,而虚拟的成员函数需要在执行阶段才能确定函数的位置,相信你知道虚拟的成员函数是用于完成C++的多态性而存在的,所以需要在类中存放着虚拟的成员函数的指针!这只是简单的原理而已,太深入我就不能说了,但我希望我这样讲会起来画龙点睛的作用。至于为什么类在没有成员变量时也会占用1个字节的空间,C++之交是这样讲的:一个类就算不包含任何成员,也不会占用0个字节的空间。至于为什么,我个人觉得没有必要太深究了!

相关推荐

一文读懂:快速查看电脑分辨率的方法
betvip5365

一文读懂:快速查看电脑分辨率的方法

📅 07-06 👁️ 7192
交警123123处理违章,12123违章罚款交费处理
正规beat365旧版

交警123123处理违章,12123违章罚款交费处理

📅 07-03 👁️ 7368
excel表原有底色怎么去掉
beat365在线下载

excel表原有底色怎么去掉

📅 07-08 👁️ 2321