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的更多相关文章

  1. TinyHttpd中sockaddr与struct sockaddr_in的区别

    上午学习TinyHttpd的源码,sockaddr 结构体以前没接触过, 在网络编程中经常用到struct sockaddr和struct sockaddr_in,这里简单介绍. 在linux环境下, ...

  2. <转>Linux环境进程间通信(二): 信号(下)

    原文地址为:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index2.html 原文为: 一.信号生命周期 从信号发送到信号处理函数的 ...

  3. [转]struct实例字段的内存布局(Layout)和大小(Size)

    在C/C++中,struct类型中的成员的一旦声明,则实例中成员在内存中的布局(Layout)顺序就定下来了,即与成员声明的顺序相同,并且在默认情况下总是按照结构中占用空间最大的成员进行对齐(Alig ...

  4. 转:struct sockaddr与struct sockaddr_in ,struct sockaddr_un的区别和联系

    在linux环境下,结构体struct sockaddr在/usr/include/linux/socket.h中定义,具体如下:typedef unsigned short sa_family_t; ...

  5. Linux环境进程间通信(二):信号(下)

    linux下进程间通信的几种主要手段: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允 ...

  6. 2. struct A 和 typedef struct A

    2. struct A 和 typedef struct A 2.1 struct A struct A{}定义一个名为struct A的结构体. 下例定义了struct A同时,声明了两个变量(注意 ...

  7. C#中struct和class的区别详解

    本文详细分析了C#中struct和class的区别,对于C#初学者来说是有必要加以了解并掌握的. 简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建 ...

  8. Linux下的文件系统2

    2017-03-13 上文针对VFS的基本信息做了介绍,并简单介绍了VFS涉及的几个数据机构,本节结合LInux源码,对各个结构之间的关系进行分析. 一.总体架构图 总体架构图如上图所示,结合进程访问 ...

  9. LInux下桥接模式详解二

    上篇文章导入博客园的比较早,而这篇自己在写的时候才发现内部复杂的很,以至于没能按时完成,造成两篇文章的间隔时间有点长! 话不多说,言归正传! 前面的文章介绍了桥接模式下的基础理论知识,其实本节想结合L ...

随机推荐

  1. 51NOD 1424 零树

    Discription 有一棵以1为根的树,他有n个结点,用1到n编号.第i号点有一个值vi. 现在可以对树进行如下操作: 步骤1:在树中选一个连通块,这个连通块必须包含1这个结点. 步骤2:然后对这 ...

  2. Java并发编程,深入理解ReentrantLock

    ReentrantLock简介 ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁, 支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次 ...

  3. 【Java TCP/IP Socket】基于线程池的TCP服务器(含代码)

    了解线程池 在http://blog.csdn.net/ns_code/article/details/14105457(读书笔记一:TCP Socket)这篇博文中,服务器端采用的实现方式是:一个客 ...

  4. MAPZONE GIS SDK接入Openlayers3之五——图形编辑工具

    图形编辑工具提供对要素图形进行增.删.改的功能,具体包括以下几种工具类型: 浏览工具 选择工具 创建要素工具 删除命令 分割工具 合并命令 节点编辑工具 修边工具 撤销命令 重做命令 工具的实现基本上 ...

  5. ASP.NET Core默认注入方式下如何注入多个实现(多种方式) - sky 胡萝卜星星 - CSDN博客

    原文:ASP.NET Core默认注入方式下如何注入多个实现(多种方式) - sky 胡萝卜星星 - CSDN博客 版权声明:本文为starfd原创文章,转载请标明出处. https://blog.c ...

  6. kafka的安装和使用;kafka常用操作命令

    kafka:基于发布/订阅的分布式消息系统.数据管道:最初用来记录活动数据--包括页面访问量(Page View).被查看内容方面的信息以及搜索情况等内容和运营数据--服务器的性能数据(CPU.IO使 ...

  7. BUPT复试专题—图像压缩存储(2015)

    题目描述 以二维数组表示图像,其值只有0.1两种,寻找两幅图像中最大的相同方阵   输入 第一行输入一个n,接下来的2n行输入两个n*n数组,寻找一个最大的m*m子区域,使得两个数组在该子区域完全相同 ...

  8. ZT:150条毒鸡汤

    1.照照镜子吧,还要什么段子? 2.多年过去,再回忆高考,其实本质上没有考到好与坏的说法,重要的是年轻人在一起,做份试题,然后决定去哪座城市做代购. 3.真正努力过的人,就会明白天赋的重要性. 4.转 ...

  9. POJ - 1062 昂贵的聘礼(最短路Dijkstra)

    昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u SubmitStatus Descr ...

  10. 安卓APK瘦身

    之前打包的时候直接就用eclipse或者android studio直接生成签名文件,并没有关心大小问题,近期有人问我有没有对APK进行瘦身.对这方面内容一致没有关注过,今天试用了各种方式把项目签名a ...