Managing C++ Objects: 管理C++对象 —— 一些建议准则
原文链接: Managing C++ Objects
Here are some guidelines I have found useful for writing C++ classes. There are many good books on the subject, but they have not been sufficient to keep me out of trouble.
(有很多书都在讨论这些主题,但是都没能让我真正搞明白)
The first time I returned to writing C++ after a year of writing Java, I was appalled at how much my design was constrained by managing the lifetime of objects.
( 当我写了很久Java以后再回头写C++才吃惊的发现,写C++是的‘管理对象的生命周期’ 让我耗费了太多的精力、受到了很多约束 )
When C++ classes share objects, then they must negotiate who owns the object. Garbage collection is not available, and smart pointers often fall short.
(C++里传递对象时,必须关注对象的所有权归于谁。没有垃圾收集,智能指针也捉襟见肘)
一句话:当你被C++里繁琐、细枝末节的语法设计搞糊涂时,多想想用Java的话会怎么写,为什么Java写起来那样简明。(C++是可以模拟Java/c#风格的)
1. 构造函数要简单。
如果几个构造函数对于某些member field设置的初始值是一样的,可以将这个抽出来成 init()方法,在每个构造函数里调一下。
2. 有几个基本的接口要配上
① 拷贝构造函数; ② 重载赋值运算符= ③ (如果可能被继承) virtual ~T() 析构函数 + dispose() 资源释放函数
3. 成员变量不要用引用&类型
因为引用成员变量必须在构造函数时进行对象绑定,而且以后不能再更换。真的没必要!
4. Optional Ownership 可选的所有权
5. 参数不要用指针形式
Pass all objects to class methods and constructors as references.(参数全部用引用&传递) There is absolutely no advantage to passing objects as pointers. (用指针传递对象没有任何优势)This rule is equally valid whether the objects are const or not.
I've already recommended that all class members be saved as pointers. You can easily take the address of an argument reference (with an ampersand) and assign it to your member pointer.
( 成员变量用的是T* pt, 参数形式是 T& t,那么只要简单的多写句 pt = &t 就行了)
If an object is passed to a constructor or initialization method, the user can expect the class to hang onto it. If a method saves an object from an argument, choose an appropriate name, like setColor(Color&) or addInterpolator(Interpolator&).
The worst excuse for using a pointer as an argument is that you want to give it a default value of null (0). You still have to document what a null object is supposed to mean. Worse, the user may overlook that the argument exists or is optional. Declare a separate method that lacks the extra argument. The effort is negligible.
6. return 对象的形式
One can always return objects from class methods by reference, either const or non-const. A user can take the address of the reference, if necessary, to save the object.
But there are no drawbacks to returning objects always as pointers. Consistency is preferable, and most API's return pointers. (用指针也没什么坏处)
(总之,保持一致性。大多数api也是返回对象的指针的)
If you return an object allocated on the heap (with a new), then be clear who has ownership of the object--your class, the recipient, or a third party.
Think about whether you are breaking encapsulation of member data in a way that will prevent modification later.
Never return a reference to a class member allocated on the stack in the header file. If your class replaces the value, then the user may be left with an invalid reference, even though your object still exists. (Other reasons: Your class will never be able to remove the object as a member. A user may manipulate the logic of your class in unexpected ways.)
A method should modify an object constructed by the user by accepting it as a non-const reference. Returning the same object would be redundant and confusing.
7. 多模仿 Java
当C++里太多细节考虑弄得心烦意乱时, 学学Java是怎么简明的!
Managing C++ Objects: 管理C++对象 —— 一些建议准则的更多相关文章
- Extension Objects(扩展对象)
设计模式之美:Extension Objects(扩展对象) 索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用示例结构实现 Extension Objects. 实现方 ...
- CreateWindowEx failed (当前程序已使用了 Window 管理器对象的系统允许的所有句柄。)
我在QT图形场景视图中通过QGraphicsProxyWidget添加代理Widget(实现添加基本的QT Widget,如按钮.复选框.日期时间控件等),当数量超过3500左右的时候,QT应用程序直 ...
- python类与对象-如何创建可管理的对象属性
如何创建可管理的对象属性 问题举例 在面向对象编程中, 我们把方法看作对象的接口, 直接访问对象的属性可能是不安全的,或设计上不够灵活. 但是使用调用方法在形式上不如访问属性简洁. circle.ge ...
- admin.ModelAdmin 后台管理关联对象,某个字段怎么显示值
admin.ModelAdmin 后台管理关联对象,某个字段如何显示值?对象 WxpAccount: accountName = ... 对象 AccountMenu: ...
- 使用Executor管理Thread对象详解
java SE5的java.util.concurrent包中的执行器(Executor)是管理Thread对象的优选方法.使用Executor管理Thread对象可以简化并发编程. Executor ...
- 爬虫学习(五)——使用handler管理器对象进行数据爬取的步骤
# 使用管理器对象进行爬取数据的步骤 import urllib.requesturl = "https://www.baidu.com/"# 创建handler的管理器对象han ...
- Docker笔记(二):Docker管理的对象
原文地址:http://blog.jboost.cn/2019/07/14/docker-2.html 在Docker笔记(一):什么是Docker中,我们提到了Docker管理的对象包含镜像.容器. ...
- 开源基于lua gc管理c++对象的cocos2dx lua绑定方案
cocos2dx目前lua对应的c++对象的生命周期管理,是基于c++析构函数的,也就是生命周期可能存在不一致,比如c++对象已经释放,而lua对象还存在,如果这时候再使用,会有宕机的风险,为此我开发 ...
- OC内存管理--zombie对象
当我们对于内存进行手动管理的时候,会出现两种错误:一种是野指针错误,一种则为内存泄露.这两点也是我们去管理内存时最终要解决的问题. 内存泄漏是指:不在使用的对象,一直保留在内存中未被销毁,一直占有着内 ...
随机推荐
- 第一部分day4-三次登录实验、字符编码
#-----三次登录实验----- memu = { "陕西":{ "西安市":{ "新城区":["大明宫遗址",&qu ...
- xadmin引入django-rest-framework
一.安装: pip install djangorestframework 安装djangorestframework库 https://github.com/encode/django-rest-f ...
- SpringBoot——IDEA使用 Spring Initializer快速创建项目【四】
前言 使用Spring Initializer快速创建项目 步骤 首先肯定是打开我们的IDEA的编辑器呀~ 创建项目 File -> New -> Project Spring Initi ...
- pycharm调整选中的变量的颜色
- excel的IRR函数
office官网找到IRR的介绍 https://support.office.com/zh-cn/article/irr-%E5%87%BD%E6%95%B0-64925eaa-9988-495b- ...
- redis缓存, 缓存击穿,缓存雪崩,缓存穿透
在实际项目中,MySQL数据库服务器有时会位于另外一台主机,需要通过网络来访问数据库:即使应用程序与MySQL数据库在同一个主机中,访问MySQL也涉及到磁盘IO操作(MySQL也有一些数据预读技术, ...
- epoll及实现http多任务(python)
1.epoll用到了文件描述符的概念: 首先,操作系统中一切皆文件 文件与文件描述符fd 文件是应用程序与系统(包括特定硬件设备)之间的桥梁,而文件描述符就是应用程序使用这个"桥梁" ...
- Java代理(静态代理、JDK动态代理、CGLIB动态代理)
Java中代理有静态代理和动态代理.静态代理的代理关系在编译时就确定了,而动态代理的代理关系是在运行期确定的.静态代理实现简单,适合于代理类较少且确定的情况,而动态代理则给我们提供了更大的灵活性. J ...
- vue+Element 表格编辑
先上效果 <template> <div> <el-table :data="tableData" style="width: 100%&q ...
- Spring Cloud @RefreshScope 原理是什么?
要清楚RefreshScope,先要了解Scope Scope(org.springframework.beans.factory.config.Scope)是Spring 2.0开始就有的核心的概念 ...