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. Codeforces 959 E Mahmoud and Ehab and the xor-MST

    Discription Ehab is interested in the bitwise-xor operation and the special graphs. Mahmoud gave him ...

  2. Java中的final关键字(转)

    Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...

  3. 【JSON注解】注解@JsonIgnoreProperties和@JsonIgnore的另一个使用情况

    之前关于这两个注解,是用在JSON循环引用的情况上,那么现在关于这两个注解,还可以使用在另外一种情况上 即: 一般标记在属性或者方法上,返回的json数据即不包含该属性 关于这种情况在什么时候会遇到呢 ...

  4. bootstrap -- col-sm-6 和 col-xs-6

  5. 【Android开发—智能家居系列】(三):手机连接WIFI模块

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 概述 实现连接WIFI的功能会用到一个工具类,源码可以点击链接下载.网上这些类似的工具类里的代码差不多是一样的.连接无线网主要有 ...

  6. pandas入门指南

    上一篇讲了numpy,除此之外,还有一个工具我们一定会使用,那就是pandas.如果说numpy中数据存储形式是列表的话,那么pandas中数据的存储形式更像是字典.为什么这么说呢?因为pandas中 ...

  7. codeforces 553 A Kyoya and Colored Balls

    这个题.比赛的时候一直在往dp的方向想,可是总有一个组合数学的部分没办法求, 纯粹组合数学撸,也想不到办法-- 事实上,非常显然.. 从后往前推,把第k种颜色放在最后一个,剩下的k球.还有C(剩余的位 ...

  8. POJ3420 Quad Tiling DP + 矩阵高速幂

    题目大意是用1*2的骨牌堆积成4*N的矩形.一共同拥有多少种方法,N不超过10^9. 这题和以前在庞果网上做过的一道木块砌墙差点儿一样. 由于骨牌我们能够横着放.竖着放.我们如果以4为列,N为行这样去 ...

  9. Android 平板中 自己定义键盘(popuwindow) 居于屏幕左下方 仿微信的password输入界面

          之前博客中,介绍过使用谷歌提供的键盘的一些api,能够非常好地自己定义键盘,參考我之前的博客链接:android 自己定义键盘 ,这个有一个局限性,仅仅能占满屏幕,无法做到仅仅能占一部分的 ...

  10. attribute constructor&destructor

    attribute constructor&destructor 在看openwrt里libnl-tiny这个库的时候,遇到了C里面的构造函数这个概念. static void __init ...