因为C++的class真的只是个struct,只不过C++编译器会在编译期对它做一些“魔改”动作而已。最开始设计的时候,class就是struct,只是个语法糖,用来触发预处理器或者编译器的特定处理而已。或者说,C++的所有class相关功能,实际上就是在struct上实现的。
因为C++的class真的只是个struct,只不过C++编译器会在编译期对它做一些“魔改”动作而已。最开始设计的时候,class就是struct,只是个语法糖,用来触发预处理器或者编译器的特定处理而已。或者说,C++的所有class相关功能,实际上就是在struct上实现的。换句话说,C++作者一开始实现编译器的时候,class支持相关的代码已经直接写进了struct的代码中,之后的其它的C++实现,也就必须保持「struct其实就是一个class」的特性,不然会导致代码不兼容。
早年,诸如游戏业的精灵抽象、unix系的“一切皆文件”等设计思想,都是用C乃至汇编表现出来的。正是这些思想启发并引导了后来的面向对象热潮。
对C来说,struct可以放任何它支持的数据类型。包括函数指针——后来C++所谓的虚函数表,很多编译器的实现,就是一个指向另一个全局结构体的指针,这个全局结构体里面是一条一条的函数指针,指向对应类重载后的所谓“虚函数”。
至于各种所谓的成员函数,实际上就是些第一个参数是classXX类型的this指针的普通函数。
换言之,struct本身已经足以支持面向对象编程运行期需要的一切了;现在,我们只需要增加一些新的语法约定,使得编译器可以帮助用户自动维护这些琐碎细节就行了——这正是
Bjarne Stroustrup当年搞Cfront的设计思路: 先把C++代码自动魔改到C,然后调用C编译器完成编译。
后期虽然有了直接支持c++的编译器(因为在cfront中加入异常支持失败),但编译器关于struct的处理并没有本质的不同。
于是,所谓class,其实就是加了某些外部支持的struct——除了编译期可能会被编译器魔改的面目全非外,它和普通struct毫无差别。
延伸阅读:
什么是C++?
C++(c plus plus)是一种计算机高级程序设计语言,由C语言扩展升级而产生,最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。
C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计。 C++几乎可以创建任何类型的程序:游戏、设备驱动程序、HPC、云、桌面、嵌入式和移动应用等。 甚至用于其他编程语言的库和编译器也使用C++编写。
C++拥有计算机运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。
文章标题:C++为什么要让 struct 可以定义成员函数,发布者:小编,转载请注明出处:https://worktile.com/kb/p/39046