C++如何通过函数地址调用函数

C++如何通过函数地址调用函数,第1张

简单说:在put函数的定义处,首先得有一个student的对象,然后通过对象调用input,调用时实参的个数,类型和input函数中的形参个数,类型都要一致。

具体解释:

c++的成员函数根据其调用的不同,大致可以分为4类:内联成员函数,静态成员函数,虚成员函数和上述3种以外的普通成员函数。从本质来说类成员函数和全局函数在调用上并没有差别,非内联函数的在调用时,基本上都包括如下的过程:函数的参数入栈,eip指针值入栈,然后跳到函数体的地址,执行函数体对应的代码,执行完毕调整栈帧。下面就按照上述4个分类进行分析,先来说一下普通的成员函数:

普通的成员函数在被调用时有两大特征:

1 普通的成员函数是静态绑定的,

2 普通的成员函数调用时编译器隐式传入this指针的值。

通过代码分析一下:

#include <iostream>

using namespace std;

class Test

{

public:

void Print(int i);

};

void Test::Print(int i)

{

cout<<i<<endl;

}

int main()

{

Test p=new Test();

p->Print(2);

system("pause");

}

上面Print函数符合上面所说4类的中的普通成员,所谓的静态绑定实质是c++源代码编译时,编编译器在p->Print();处翻译成直接调用Test类中Print()的汇编代码,也就是编译期编译器就确定了被调函数的相对地址。而所谓的动态绑定实质是,源码在编译的时候,编译器不是翻译成直接调用Test类中Print()的汇编代码,而是翻译成一个查找虚表,得到到函数的相对地址的过程。

首先,类对象和对象指针其实就是对应的一段内存的首地址。

调用的成员函数的时候,比如成员函数为:void student::fun(int a);,这个fun有一个参数,但实际fun还有一个隐式参数,这个参数其实传递到函数进去的就是该类的对象或指针,它是该类保存数据的内存首址,当fun中改变成员变量的值时,就是改变这个传递过来的地址指针所指向的那块内存的数据,由此不同的对象所指向的内存不同,所以对象与对象之间互不打扰。

简单点,非静态成员变量占用空间,成员函数(无论是否是静态的)则不占用空间:

class  MyClass{

int a;  //占用4字节

float b; //占用4字节

static int c;//在全局数据区,所有对象共享,不计入各对象中

int fun1(); //不占用对象的空间

float fun2();//不占用对象的空间

static int fun3();//不占用对象的空间

};

MyClass类的实例中:

占用24=8个字节 (即a b这两个成员)

涉及虚函数表那些你在另外研究。

c++中struct和class在计算对象大小时你就不用区别了,计算方法一样。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12156569.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存