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. [Bzoj1112][POI2008]砖块Klo(splay)

    1112: [POI2008]砖块Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2353  Solved: 831[Submit][Statu ...

  2. [Bzoj3675][Apio2014]序列分割(斜率优化)

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 4021  Solved: 1569[Submit][Stat ...

  3. noip2015提高组day2解题报告

    1.跳石头 题目描述 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石( ...

  4. js创建post请求

    /**js提交post请求:隐藏请求参数**/function postDetail(URL, PARAMTERS) { //创建form表单 var temp_form = document.cre ...

  5. open-falcon的插件机制

    Plugin可以看做是对agent功能的扩充.对于业务系统的监控指标采集,最好不要做成plugin,而是把采集脚本放到业务程序发布包中,随着业务代码上线而上线,随着业务代码升级而升级,这样会比较容易管 ...

  6. oracle学习 第二章 限制性查询和数据的排序 ——03

    这里.我们接着上一小节2.6留下的问题:假设要查询的字符串中含有"_"或"%".又该如何处理呢? 開始今天的学习. 2.7  怎样使用转义(escape)操作符 ...

  7. 【转】 C++ 简单的 Tcp 实现[socket] 客户端与客户端通信

    //  服务器端代码 // Server.cpp : Defines the entry point for the console application.// #include "std ...

  8. WSDL4J解析WSDL文件方法

    利用wsdl4j解析WSDL文件 工具:wsdl4j1.6 解析wsdl文件是axis1.4的服务wsdl文件 wsdl文件: <?xml version="1.0" enc ...

  9. C#总结复习5(需要进一步复习)

    第十五章 接口 1.接口: C++中允许多继承没有接口的概念.而java与C#中有,因为C#中 是单继承多接口. 所谓的接口,其实和抽象类.方法相似.都只有一个空方法.其本身不可以为基类,但是允许被其 ...

  10. 使用zTree进行数据动态显示

    由于公司项目的须要.现学了一下zTree的使用. 以下是我项目的结构图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVuamFtaW5fd2h4/f ...