龙空技术网

C++成员函数,如何在内存中存储?整理、总结 linux C++第21讲

远峰linux编程学堂 244

前言:

此刻你们对“c语言结构体存储数据”大体比较重视,姐妹们都想要了解一些“c语言结构体存储数据”的相关文章。那么小编同时在网上搜集了一些有关“c语言结构体存储数据””的相关内容,希望咱们能喜欢,各位老铁们一起来学习一下吧!

成员函数的存储方式

学习C语言的变量定义时,我们就知道,定义一个变量,就需要在内存中申请空间,存放变量的数据。例如:

double a;

此时,定义一个double类型的变量。double类型占据8个字节的内存空间,那么,在内存中,就划分出8个字节的空间,存放变量a的数据。

所以,用类去定义对象时,系统会为每一个对象分配存储空间。如果类包括了数据和函数,要分别为数据和函数的代码分配存储空间。按理说,如果用同一个类定义了10个对象,那么,就需要分别为10个对象的数据和函数代码分配存储单元。

进一步分析,可以看到:一般情况下,不同对象的数据存储单元中存放的数据值是不相同的,而不同对象的函数的代码是相同的,无论调用哪一个对象的函数的代码,其实调用的都是同样内容的代码。既然这样,在内存中开辟10段空间来分别存放10个相同内容的函数代码段,显然是浪费空间资源,是没有必要的。

那么,C++语言的发明者自然会想到:能否只用一段空间来存放这个共同的函数代码段,在调用各对象的函数时,都去调用这个公用的函数代码,如下图所示:

显然,这样做会大大节约存储空间。C++编译系统正是这样做的,因此,每个对象所占用的存储空间只是该对象的数据部分所占用的存储空间,而不包括函数代码所占用的存储空间,如果声明了一个类:

可以看到,输出变量stud的容量是32个字节。这就证明了一个对象所占用的空间大小只取决于该对象中成员变量所占的空间,而与成员函数无关。所以,student类定义了student()、print()函数,并不占据stud对象的存储空间。

函数代码是存储在对象空间之外的。如果对同一个student类定义了10个对象,这些对象的成员函数对应的是同一个函数代码段,而不是10个不同的函数代码段。需要注意的是:虽然调用不同对象的成员函数时都是执行同一段函数代码,但是,执行结果一般是不相同的。程序测试例子如下:

程序运行结果如下:

可以看到,使用student类定义了stud1, stud2对象。可以看到,stud1, stud2对象分别调用同一个print()函数,但是,输出的信息是不一样的。其中,stud1.print()输出的是stud1对象的信息,stud2.print()输出的是stud2对象的信息。

所以,对象stud1的成员函数访问的是本对象stud1中的成员。那么,就发生了一个问题:不同的对象使用的是同一个函数代码段,它怎么能够分别对不同对象中的数据进行操作呢?

原来C++为此专门设立了一个名为this的指针,用来指向不同的对象。当调用对象stud1的成员函数时,this指针就指向stud1,成员函数访问的是stud1的成员。当调用对象stud2的成员函数时,this指针就指向stud2,此时,成员函数访问的就是stud2的成员,关于this指针,在后续章节会做更详细讨论。

注意:this指针是C++的灵魂,使用C语言来进行面向对象编程的时候,就是模拟了C++的this指针对象,才让C语言的struct结构体有了灵魂。在通过函数指针调用自己的成员函数时,通过this对象可以操作自己的数据和函数。实现对象化的编程,就是面向对象编程的基础。

标签: #c语言结构体存储数据