原文链接: 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++对象 —— 一些建议准则的更多相关文章

  1. Extension Objects(扩展对象)

    设计模式之美:Extension Objects(扩展对象)   索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):使用示例结构实现 Extension Objects. 实现方 ...

  2. CreateWindowEx failed (当前程序已使用了 Window 管理器对象的系统允许的所有句柄。)

    我在QT图形场景视图中通过QGraphicsProxyWidget添加代理Widget(实现添加基本的QT Widget,如按钮.复选框.日期时间控件等),当数量超过3500左右的时候,QT应用程序直 ...

  3. python类与对象-如何创建可管理的对象属性

    如何创建可管理的对象属性 问题举例 在面向对象编程中, 我们把方法看作对象的接口, 直接访问对象的属性可能是不安全的,或设计上不够灵活. 但是使用调用方法在形式上不如访问属性简洁. circle.ge ...

  4. admin.ModelAdmin 后台管理关联对象,某个字段怎么显示值

    admin.ModelAdmin 后台管理关联对象,某个字段如何显示值?对象 WxpAccount:              accountName = ... 对象 AccountMenu:    ...

  5. 使用Executor管理Thread对象详解

    java SE5的java.util.concurrent包中的执行器(Executor)是管理Thread对象的优选方法.使用Executor管理Thread对象可以简化并发编程. Executor ...

  6. 爬虫学习(五)——使用handler管理器对象进行数据爬取的步骤

    # 使用管理器对象进行爬取数据的步骤 import urllib.requesturl = "https://www.baidu.com/"# 创建handler的管理器对象han ...

  7. Docker笔记(二):Docker管理的对象

    原文地址:http://blog.jboost.cn/2019/07/14/docker-2.html 在Docker笔记(一):什么是Docker中,我们提到了Docker管理的对象包含镜像.容器. ...

  8. 开源基于lua gc管理c++对象的cocos2dx lua绑定方案

    cocos2dx目前lua对应的c++对象的生命周期管理,是基于c++析构函数的,也就是生命周期可能存在不一致,比如c++对象已经释放,而lua对象还存在,如果这时候再使用,会有宕机的风险,为此我开发 ...

  9. OC内存管理--zombie对象

    当我们对于内存进行手动管理的时候,会出现两种错误:一种是野指针错误,一种则为内存泄露.这两点也是我们去管理内存时最终要解决的问题. 内存泄漏是指:不在使用的对象,一直保留在内存中未被销毁,一直占有着内 ...

随机推荐

  1. pandas基础操作

    ```python import pandas as pd import numpy as np ``` ```python s = pd.Series([1,3,6,np.nan,44,1]) s ...

  2. 五、Xpath与lxml类库

    什么是XML XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 的标签需要 ...

  3. bzoj2287【POJ Challenge】消失之物 缺一01背包

    bzoj2287[POJ Challenge]消失之物 缺一01背包 链接 bzoj 思路 分治solve(l,r,arr)表示缺少物品\([l,r]\)的dp数组arr. 然后solve(l,mid ...

  4. centos6中安装新版 Elasticsearch 7.x

    es出新版了,虽然公司里还是用的老版本,但是本地还是有必要自己安装了玩玩 下载地址:https://www.elastic.co/cn/downloads/elasticsearch 那么一般来说还是 ...

  5. 11-散列4 Hashing - Hard Version (30 分)

    Given a hash table of size N, we can define a hash function H(x)=x%N. Suppose that the linear probin ...

  6. vb.net 获取文件的版本号

    dim strVersion =  Reflection.Assembly.LoadFrom(strFileName).GetName().Version.ToString()

  7. es6 - spreed & rest 【... 扩展运算符】

    扩展运算符:…运算符 好处:简化书写长度,提升开发效率. 具备两个功能: 1.展开功能 2.收集功能 所以…运算符又可以叫做展开收集运算符. 他的不同作用需要在不同场景中使用才会出现: a.读 - 展 ...

  8. CSS 分割线

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Python爬虫爬取BT之家找电影资源

    一.写在前面 最近看新闻说圣城家园(SCG)倒了,之前BT天堂倒了,暴风影音也不行了,可以说看个电影越来越费力,国内大厂如企鹅和爱奇艺最近也出现一些幺蛾子,虽然目前版权意识虽然越来越强,但是很多资源在 ...

  10. 使用vue搭建应用六实现登录页

    1.js_cookie js-cookie插件是一个JS操作cookie的插件 安装 yarn add js-cookie 使用 写入 Cookies.set('name', 'value'); 读取 ...