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对象
当我们对于内存进行手动管理的时候,会出现两种错误:一种是野指针错误,一种则为内存泄露.这两点也是我们去管理内存时最终要解决的问题. 内存泄漏是指:不在使用的对象,一直保留在内存中未被销毁,一直占有着内 ...
随机推荐
- Java错误体系
1.Java所有的异常错误都继承与Throwable类,只有继承了Throwable类,才能在异常传递体系中进行. 2.Throwable下有两个重要的子类,Error和Exception Error ...
- python 和 R 语言中的等差数列
等差数列的通项公式:an = a0 + n*d. 数学上 n 是可以取遍整个整个正整数集的,在现实中,n 是有范围的. 1.R 语言用 seq() 函数产生等差数列: 2.python 中 ran ...
- Linux—— 记录所有登陆用户的历史操作记录
前言 记录相应的人登陆服务器后,做了那些操作,这个不是我自己写的,因为时间久了,原作者连接也无法提供,尴尬. 步骤 history是查询当前连接所操作的命令,通过编写以下内容添加至/etc/profi ...
- CentOS7编译安装Keepalived2.0.19
实验环境:centos7 节点1:10.15.192.21 节点2:10.15.192.22 vip地址:10.15.192.23 1.下载文件 cd /usr/local/src wget http ...
- 平台级 SAAS 架构的基础:统一身份管理系统
https://my.oschina.net/bochs/blog/2248954 业内在用户统一身份认证及授权管理领域,主要关注 4 个方面:集中账号管理(Account).集中认证管理(Authe ...
- JavaScript基础09——事件驱动
1.事件驱动 js控制页面的行为是由事件驱动的. 什么是事件?(怎么发生的) 事件就是js侦测到用户的操作或是页面上的一些行为 事件源(发生在谁身上) 引 ...
- SPA项目开发之登录注册
CMD安装所需要的pom依赖 npm install element-ui -S npm install axios -S npm install qs -S npm install vue-axio ...
- 深入js系列-类型(对象)
开篇 值的传递方式 1.值传递 表示传递过程中复制了值 2.引用传递 表示传递过程中传递的是值的引用 js的传递方式 值传递 看下面的例子 // 这里值传递很容易理解 var a = 1 var b ...
- Math的round方法
代码如下,后面的注释是输出的结果 public static void main(String[] args) { System.out.println(Math.round(0.399)); Sys ...
- [BZ1925] [SDOI2010]地精部落
[BZ1925] [SDOI2010]地精部落 传送门 一道很有意思的DP题. 我们发现因为很难考虑每个排列中的数是否使用过,所以我们想到只维护相对关系. 当我们考虑新的一个位置时,给新的位置的数分配 ...