C++核心准则C.2:包含不变式时用class,否则用struct定义类

Stella981
• 阅读 312

C++核心准则C.2:包含不变式时用class,否则用struct定义类

C.2: Use class if the class has an invariant; use struct if the data members can vary independently

C.2:类包含不变式是使用class定义类,如果数据成员可以独立变更时使用struct定义类。

译者注:不变式可以认为是类的成员必须满足的条件。例如对于std::string来说,长度成员必须等于其管理的字符串长度。

Reason(原因)

Readability. Ease of comprehension. The use of class alerts the programmer to the need for an invariant. This is a useful convention.

可读性。降低理解难度。使用class关键字让程序员意识到需要不变式。这是一个有用的惯例。

译者注:使用class关键字还默认保证了数据成员不会被随意修改,这使维持不变式成为可能。

Note(注意)

An invariant is a logical condition for the members of an object that a constructor must establish for the public member functions to assume. After the invariant is established (typically by a constructor) every member function can be called for the object. An invariant can be stated informally (e.g., in a comment) or more formally using Expects.

不变式是一个对象的成员必须满足的逻辑条件,这些条件由构造函数建立,是public成员函数的前提条件。一旦不变式成立(通常是由构造函数),该对象所有成员函数都可以被调用。不变式可以被非正式的说明(例如通过注释),或者通过Expects(事前条件)正式检查。

If all data members can vary independently of each other, no invariant is possible.

如果所有数据成员都可以相互独立地变更,则不可能存在不变式。

Example(示例)
struct Pair {  // the members can vary independently

but:

class Date {

译者注:这个例子的不变式是年月日的组合必须有效。

Note(注意)

If a class has any private data, a user cannot completely initialize an object without the use of a constructor. Hence, the class definer will provide a constructor and must specify its meaning. This effectively means the definer need to define an invariant.

如果一个类包含私有数据成员,使用者就不能在不使用构造函数的情况下完全初始化该类的对象。因此,类的定义者在提供构造函数的同时,必须定义其含义。这实际上意味着定义者需要定义不变式。

See also(参见):

  • define a class with private data as class

    使用class关键字定义包含私有数据的类。

  • Prefer to place the interface first in a class

    推荐在类的最初定义接口

  • minimize exposure of members

    最小限度暴露成员

  • Avoid protected data

    避免protected类型数据

Enforcement(实施建议)

Look for structs with all data private and classes with public members.

找到所有数据都被定义为私有的结构体和包含公有成员(应为数据成员,译者注)的类。

译者注:所谓原则就是不需要深入思考就可以执行,而效果却会逐渐显现的那些良好实践。

英文原文地址:https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rc-struct

觉得本文有帮助?请分享给更多人。

关注【面向对象思考】,轻松学习每一天!

有任何疑问,欢迎留言提问或讨论。


面向对象设计,面向对象编程,面向对象思考!

C++核心准则C.2:包含不变式时用class,否则用struct定义类

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Discuz X3.2源码解析 discuz_application类(转自百度)
1.discuz\_application在/source/class/discuz/discuz\_application.php中。!DiscuzX3.2源码解析discuz_application类(https://oscimg.oschina.net/oscnet/99b35d79caf70b7c74ad0838d6
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
(绝对有用)iOS获取UUID,并使用keychain存储
UDID被弃用,使用UUID来作为设备的唯一标识。获取到UUID后,如果用NSUserDefaults存储,当程序被卸载后重装时,再获得的UUID和之前就不同了。使用keychain存储可以保证程序卸载重装时,UUID不变。但当刷机或者升级系统后,UUID还是会改变的。但这仍是目前为止最佳的解决办法了,如果有更好的解决办法,欢迎留言。(我整理的解决办法的参
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这