1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > c++函数指针和函数对象

c++函数指针和函数对象

时间:2020-07-24 22:48:11

相关推荐

c++函数指针和函数对象

C++ 函数指针和函数对象

一、 导述二、c++成员函数在内存中的存储方式补1:静态数据和常量的区别:三、函数指针四、函数对象

一、 导述

博主认为,要想正确深入了解c++中的函数类型和函数指针,就应当首先了解在c++中成员函数在内存中的存储方式。

因此,本文会按照从基础概念到实际应用,由表及里的顺序撰写博主对函数指针和函数类型的理解。

二、c++成员函数在内存中的存储方式

c++中的内存划分为以下四个部分:

1)全局数据区(data area)

2)代码区(code area)

3)栈区(stack area)

4)堆区(heap area),即自由存储区

其中,全局数据区存放全局变量、静态数据和常量【补1】;代码区存放类成员函数和非成员函数代码;栈区存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等;余下的空间都被称为堆区。

用类去定义对象时,系统会为每个对象分配存储空间。如果一个类包含了数据和函数,要分别为数据和函数的代码分配存储空间。注意,为了节约存储空间,避免为每个对象重复开辟相同的代码区,所以在c++中,每个对象所占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分)所占用的存储空间,而不包括函数代码所占用的存储空间。

因此,在类的定义时,类成员函数是放在代码区,而类的静态成员变量在类定义时就已经在全局数据区分配了内存,因而它是属于类的,对于非静态成员变量,我们是在类的实例化过程中(构造对象)为其分配内存,所以它属于对象。

另外,再补充类的静态成员函数和非静态成员函数的区别:静态成员函数和非静态成员函数都是在类的定义时存放在内存的代码区的,因此可以说他们都是属于类的,但是因为类的非静态成员函数都内含了一个指向类对象的指针型参数(即this指针),因而只有类对象才能调用(此时this指针有实际值),所以类只能调用静态成员函数,不能调用非静态成员函数(即使函数没有参数)

总结:

类的成员函数不管是不是静态的,都不占用对象的存储空间,都是存放在内存的代码区,属于类。

补1:静态数据和常量的区别:

c++有四种数据成员:

1)常量数据成员 const

2)静态数据成员static

3)普通数据成员normal

4)静态常量成员 static const

const定义的常量在超出其作用域之后,其内存空间会被释放。

const数据成员的初始化只能在类的构造函数的初始化列表中进行。要想建立在整个类中都恒定的常量,应该用类的枚举常量或者static const来实现。

const数据成员,只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同,所以不能在类的声明中初始化const数据成员,因为类的对象没被创建时,编译器不知道const数据成员的值是什么。

static静态成员变量不能在类的内部初始化,static定义的静态常量在函数执行后不会释放其存储空间。

static表示的是静态的。类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。即使没有具体对象,也能调用类的静态成员函数和成员变量。一般类的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件。

c++中static成员不能在类的内部初始化。在类的内部只能是声明,定义必须在类定义体的外部,通常在类的实现文件中初始化。

三、函数指针

函数指针是指向函数地址的指针变量,在c++编译时,每一个函数都有一个入口地址,那么指向这个函数的函数指针便指向这个地址。

函数指针主要用于调用函数和用作函数参数。

声明方式:typedef (*函数名)(形参)int(*Add1)(int a, int b);int(*Add2)(int a, int b);

具体的使用方式:

int AddFunc(int a, int b){return a + b;}int main(){int(*Add1)(int a, int b);int(*Add2)(int a, int b);Add1 = AddFunc;Add2 = &AddFunc;//是否用&结果都一样,只要是将函数用作赋值,都默认转换成函数指针。cout << (*Add1)(3, 2) ;cout << (*Add2)(3, 2) << endl;return 0;}

最后的结果是5 5

四、函数对象

c++函数对象实质上是操作符重载,实现了对()操作符的重载。c++函数对象不是函数指针,但是在程序中,它的调用方式与函数指针一样,后面加个括号就好了。

使用方式是

int AddFunc(int a, int b){return a + b;}class Add{public:const int operator()(const int a,const int b){return a + b;}};int main(){int(*Add1)(int a, int b);int(*Add2)(int a, int b);Add1 = AddFunc;//函数指针Add2 = &AddFunc;//函数指针cout << (*Add1)(3, 2) << endl;//函数指针cout << Add2(3, 2) << endl;//函数指针 也可以不用加*Add function;//函数对象cout << function(2, 3) << endl;return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。