C++ 下啥时候用struct, 啥时候用class
struct 由c语言引入。在c语言中,是定义结构化数据的标准选择。
c++ 同时支持struct 和 class. 原因之一是c++ 是 c 的超集,涵盖c 已支持的语言要素,将更好的支持向下兼容(原来能够工作的c 源程序移植到c++,可以支付极少甚至0代价)
实际上,c++ 的class已经对struct 进行了完全的覆盖,即是说,原来用struct 实现的结构体,完全可以用class 代替。
那么问题出来了,一个新项目, 什么时候应该使用struct, 同样的东西,用struct实现或者用class实现,性能上有没有区别。
struct 和 class 实际在C++ 中没有什么区别。
struct 仍然可以继承自另一个struct (很少看到有人这么干)。
struct 默认的字段类型是public, 默认的继承方式也是public, 而class 的默认字段类型是private, 默认继承方式也是private。
未见任何文档有描述说struct 比 class 更快。个人感觉既然struct 和 class 在实现上可以互换,也就是说要支持相同的语言级基础设施和复杂度,那么就不应该存在用哪个更快的问题(同等级别对象, 你不能拿一个有4个字段的Rect 结构体 和一个带Hashtable 的ResManager相比)
由于struct 和 class 的可替换性,什么时候用struct 和什么时候用class的选择就相当主观了。通常大家的直觉是一致的: struct 应该应用于POD(Plain old data)类型的对象. 用一个词来描述,他们更像是记录, 一个简单的集合,里面有几个字段, 例如 struct Color, struct Rect, struct Point 等都是我们常见的结构。
而class 实际上更适合用于抽象主动的对象, 他们通常可以有复杂的继承关系(个人认为太复杂是一种作死的行为,稍后解释)。 或许有更多的方法和逻辑。对于class来讲,内部数据除了理解为记录, 更有一部分是“状态”。
另外一个struct 的好处是:
它可以很方便的序列化和反序列话,比如,直接拿到一个struct 的指针。 sizeof取得大小,直接把对象存储到文件或写入网络。当然基于某些原因。我也不建议这么做。
顺口说一句:我其实更倾向于基于对象而反对Pure面向对象。
教课书上,为了教会人使用C++, 通常会这么举例:
好,你现在定义一个“人”,那么他的继承树应该是这样的:
有莫有,有莫有这样的。
人还有类似 说话,吃饭,骗其他人感情和身体 这些方法。
猴子就要简单些,只会叫唤,但是由于他们都继承自哺乳动物,所以他们都有继承自哺乳动物的方法 喂奶。至于植物系的,当然就没有那么高级了,但是他和哺乳动物一样,又从LivingThing 那里继承了一些东西,比如生长和死亡。当然我承认那个植物人是开玩笑的。
还有一些是拿交通工具举例的。。看起来多么优雅,代码重用性超高。
对于这种为了面向对象而面向对象的思维方式,我只想说看到这样的代码,可以直接拖出去毙了。原因是,稍微复杂点的项目,没人会这么干。因为继承树的深度在以指数的方式影响复杂度。有天你会发现,想实现一个SuperMan, 根本无从下手,想改变一个基类方法,不知道他最终会影响哪些类。
我同意muduo的作者那个谁的观点:
在你要对一个代码进行修改(可能是Fix bug, 也可能是添加一个新的功能), 首先要做的事情,绝对不是直接撸袖子开始干代码。首先是要想出要怎么改。为了要想出一个方案,你首先要了解当前的代码,把代码理解了,就如同内存装载数据一样。优雅的代码,你只需要了解很少的相关代码(这也是提倡解耦的原因)。所以如果是上图所示的代码。。我想问问你的脑存今年有没有升过级。
我自己比较接受Service 和 Data分开的原则,模块化比面向对象更重要,另外在基础框架稳固的前提下。基于组件的设计原则也是极其爽的,特别是游戏开发。Unity3d的引擎就是基于组件的。啥都是组件。
嗯,当然这是另一个议题。我好像严重跑题了。
于是今年是2015年了。我上一次,最后一次更新博客是,擦 2008年离现在有7年了。
现在我回来了。
有些时候脑袋里面好多似是而非的东西,不如认真去调查,顺手再写篇log作为记录。
也欢迎任何人怒骂嘲讽。
C++ 下啥时候用struct, 啥时候用class的更多相关文章
- TinyHttpd中sockaddr与struct sockaddr_in的区别
上午学习TinyHttpd的源码,sockaddr 结构体以前没接触过, 在网络编程中经常用到struct sockaddr和struct sockaddr_in,这里简单介绍. 在linux环境下, ...
- <转>Linux环境进程间通信(二): 信号(下)
原文地址为:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html 原文为: 一.信号生命周期 从信号发送到信号处理函数的 ...
- [转]struct实例字段的内存布局(Layout)和大小(Size)
在C/C++中,struct类型中的成员的一旦声明,则实例中成员在内存中的布局(Layout)顺序就定下来了,即与成员声明的顺序相同,并且在默认情况下总是按照结构中占用空间最大的成员进行对齐(Alig ...
- 转:struct sockaddr与struct sockaddr_in ,struct sockaddr_un的区别和联系
在linux环境下,结构体struct sockaddr在/usr/include/linux/socket.h中定义,具体如下:typedef unsigned short sa_family_t; ...
- Linux环境进程间通信(二):信号(下)
linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...
- 2. struct A 和 typedef struct A
2. struct A 和 typedef struct A 2.1 struct A struct A{}定义一个名为struct A的结构体. 下例定义了struct A同时,声明了两个变量(注意 ...
- C#中struct和class的区别详解
本文详细分析了C#中struct和class的区别,对于C#初学者来说是有必要加以了解并掌握的. 简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建 ...
- Linux下的文件系统2
2017-03-13 上文针对VFS的基本信息做了介绍,并简单介绍了VFS涉及的几个数据机构,本节结合LInux源码,对各个结构之间的关系进行分析. 一.总体架构图 总体架构图如上图所示,结合进程访问 ...
- LInux下桥接模式详解二
上篇文章导入博客园的比较早,而这篇自己在写的时候才发现内部复杂的很,以至于没能按时完成,造成两篇文章的间隔时间有点长! 话不多说,言归正传! 前面的文章介绍了桥接模式下的基础理论知识,其实本节想结合L ...
随机推荐
- Linux内核配置选项
http://blog.csdn.net/wdsfup/article/details/52302142 http://www.manew.com/blog-166674-12962.html Gen ...
- PHP用CURL发送Content-type为application/json的HTTP/HTTPS请求
<?php $headers = array( "Content-type: application/json;charset='utf-8'", "Accept: ...
- docker 配置 direct-lvm
当前需要设置的宿主机是环境是搭建在vbox虚拟机上的centos7系统.测试环境中出现过一次意外情况,当时为了测试docker日志文件限制,运行了一个docker容器,但是后面忘记停止了,几天后发现了 ...
- 最近遇到的C++数字和字符串的转换问题
1. 用itoa 和atoi 在头文件#include<cstidlib> itoa用法: char * itoa ( int value, char * str, int base ) ...
- CentOS安装Openfire服务
原文::http://xiao987334176.blog.51cto.com/2202382/979677 系统是全新新安装的系统.版本号是Centos 5.6 x86 同步北京时间 # ntpda ...
- Android兼容性测试CTS
一.简介 为了确保Android应用能够在所有兼容Android的设备上正确运行,并且保持相似的用户体验,在每个版本发布之时,Android提供了一套兼容性测试用例集合(Compatibility ...
- 2014MadCon厦门分享会-笔记(下)
32 <如何与百度互动,不知道这些就不要做SEO了>百度站长平台资深产品运营师 曹丽丽(飞鸟) 33 注意百度站长平台的提醒.如果你不留电话,不留其他联系方式,出问题了,百度怎么提醒你呢? ...
- WPF新手之如何将数据绑定到TreeView
看过许多例子,全是绑定到类的,没人说如何绑定到某个对象,偏偏我这个绝对的新手就是要绑定到一个对象,只能自己摸索了: 首先要将数据绑定到容器,有以下几个默认条件:①元数据必须包装在List或者Obser ...
- Hadoop如何计算map数和reduce数
阅读本文可以带着下面问题: 1.map和reduce的数量过多会导致什么情况? 2.Reduce可以通过什么设置来增加任务个数? 3.一个task的map数量由谁来决定? 4.一个task的reduc ...
- 深度学习入门-4.1 AND.py 源码分析
源代码 ------------------------------------------------------------------------------------------------ ...