问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c++为什么要让struct可以定义成员函数

发布网友 发布时间:2022-04-24 12:55

我来回答

2个回答

热心网友 时间:2023-10-13 13:21

因为C++的class真的只是个struct,只不过C++编译器会在编译期对它做一些“魔改”动作而已。

早年,诸如游戏业的精灵抽象、unix系的“一切皆文件”等设计思想,都是用C乃至汇编表现出来的。正是这些思想启发并引导了后来的面向对象热潮。

对C来说,struct可以放任何它支持的数据类型。包括函数指针——后来C++所谓的虚函数表,很多编译器的实现,就是一个指向另一个全局结构体的指针,这个全局结构体里面是一条一条的函数指针,指向对应类重载后的所谓“虚函数”。
至于各种所谓的成员函数,实际上就是些第一个参数是classXX类型的this指针的普通函数。

换言之,struct本身已经足以支持面向对象编程运行期需要的一切了;现在,我们只需要增加一些新的语法约定,使得编译器可以帮助用户自动维护这些琐碎细节就行了——这正是 Bjarne Stroustrup当年搞Cfront的设计思路: 先把C++代码自动魔改到C,然后调用C编译器完成编译。

后期虽然有了直接支持c++的编译器(因为在cfront中加入异常支持失败),但编译器关于struct的处理并没有本质的不同。

于是,所谓class,其实就是加了某些外部支持的struct——除了编译期可能会被编译器魔改的面目全非外,它和普通struct毫无差别。

这个支持一般来说应该是这样的(但并不禁止编译器厂商选择其他方案):
1、对普通成员函数,为它自动添加this参数,并在调用它时,自动把 obj.method() 转换成 method(obj)格式;并识别出函数中涉及的、没有显式使用this的成员变量、为它加上this。
除此之外,别的什么都不用做。

2、对虚函数,需要为继承链上的每个类产生一个全局结构体,在这个结构体里按次序安排指向该类所有虚函数的指针,这就是虚函数表;然后在类里添加一个指向属于自己的虚函数表的指针。
那么,当用户调用某个对象的第N个虚函数时,到虚函数表查找并获取第N个函数指针指向的内容;然后类似调用普通成员函数一样,把 obj.method() 转换成 method(obj)格式,多态就实现了。

当然,除此之外,还要在编译时执行权限检查,避免非法访问类的protect/private成员(struct默认权限是public,class是private);以及另外一些琐碎工作。

所以你看,c++的类归根结底,它就是个C语言的struct。只是(相当于)在编译期做了些预处理而已——只要你在里面声明了成员函数,就会自动触发预处理,从而实现“自动魔改你所定义的数据结构,使其支持OO诸要素”功能。

那么,除了让C代码共用C++里面定义的struct这个特殊场景外(想了解这类能兼容C的数据类型,可搜索 POD类型),你说还有什么理由禁止struct拥有成员函数呢?
望采纳,谢谢

热心网友 时间:2023-10-13 13:21

struct就和class一样,只是默认的访问级别不一样
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
抖音弹幕怎么关掉?怎么关闭抖音弹幕? 惠普LaserJet P3005D是否支持B5纸的双面打印? word打印出图片总是缺一部分怎么办-word打印图片不完整怎么解决_百度... 理想one哪里产的车辆? 抚州抚州ONE在哪里? one地址在哪里? 如何在图片上写字(如何在图片上添加文字) 网商贷为什么钱没到账 高级经济师职称怎么评 高级经济师需要评审吗 结构体函数如何定义 关于C语言的结构体函数 C++ struct 函数传值的问题 oppor11相机时间水印 c语言 于struct调用 OPPOR11s拍照可以显示时间么? c语言中struct当作函数使用 关于struct 函数指针的指针问题 struct :c语言中的这个是什么意思啊 0PP0R11St手机拍照时间怎么设置? c语言 struct 能定义函数吗 这两个struct函数什么区别 struct{ int x; int y; }test1; 和 s 2017款上市的OPPO R11如何在照片上显示时间的水印?如:2017-7-15 在C语言中struct结构体里面 不能定义函数么? C语言struct函数? 谁能告诉我C语言中的struct函数是干嘛的? struct这个函数到底怎么用 在证券公司工作是怎样一种体验呢? 金融分析师晚上工作到几点 在证券公司工作早上几点上班? struct point函数是什么意义? c++函数参数可以是struct吗? C语言中的struct能添加函数吗 结构体struct与函数引用 struct的成员如何在函数的参数里引用 什么是PC笔记本啊? 笔记本电脑是商务本好还是游戏本好? 中国电信畅连通话什么意思? 电脑的 标准USB供电参数是多少? 为什么usb-can转换器的供电电压要求有的是9-24V,有的是9-30V呢? 笔记本usb供电是多少安 如何调节台式电脑usb接口处电压? usb接口对所有第三方的集线器的电压要求是多大 中华人民共和国USB电源线标准 台式电脑的USB口最大可提供多大的供电量? USB 1.1和2.0两个标准的供电电压究竟是否一样? USB-C扩展坞的USB3.0输出电压和电流一般是多少? USB 2.0 供电常识问题 思碁SERJUR无线同屏器的USB口供电有什么要求吗 社保转移后多久能合并到一起