摘要: swap 函数最初由 STL 引入,已经成为异常安全编程的关键函数, 同时也是解决自赋值问题的通用机制。 std 中它的基本实现是很直观的: 可以看到,上述 swap 是通过赋值和拷贝构造实现的。所以 std::swap 并未提供异常安全, 但由于 swap 操作的重要性,我们应当为自定义的类实现异 阅读全文
posted @ 2020-02-08 21:23 刘-皇叔 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 当类型转换应该用于所有参数时,声明为非成员函数 最好不要提供隐式的类型转化, 但这条规则也存在特例,比如当我们需要创建数字类型的类时。正如 double 和int 能够自由地隐式转换一样, 我们的数字类型也希望能够做到这样方便的接口。 当然这一节讨论的问题不是是否应当提供隐式转换,而是如果运算符的所 阅读全文
posted @ 2020-02-08 20:47 刘-皇叔 阅读(126) 评论(0) 推荐(0) 编辑
摘要: 在类的是实现中,常常会面临成员函数和非成员函数的选择。比如一个浏览器类: 此时你要实现一个 clearEverything() 有两种方式: 面向对象原则指出,数据和数据上的操作应当绑定在一起,那么前者更好。 这是对面向对象的误解,面向对象设计的精髓在于封装,数据应当被尽可能地封装。 相比于成员函数 阅读全文
posted @ 2020-02-08 18:10 刘-皇叔 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 数据成员声明为私有可以提供一致的接口语法,提供细粒度的访问控制,易于维护类的不变式,同时可以让作者的实现更加灵活。而且我们会看到,protected 并不比 public 更加利于封装。 语法一致性 你肯定也遇到过这种困惑,是否应该加括号呢: 如果我们把所有数据都声明为私有,那么在调用语法上,统一用 阅读全文
posted @ 2020-02-08 17:38 刘-皇叔 阅读(115) 评论(0) 推荐(0) 编辑
摘要: 不要返回空的引用或指针 一个典型的场景如下: 注意 返回的是 Rational 实例, 时便会调用 , 返回值被拷贝后用来初始化 c。这个过程涉及到多个构造和析构过程: 函数调用结束前,返回值被拷贝,调用拷贝构造函数。 函数调用结束后,返回值被析构。 c 被初始化,调用拷贝构造函数。 c 被初始化后 阅读全文
posted @ 2020-02-08 17:23 刘-皇叔 阅读(106) 评论(0) 推荐(0) 编辑
摘要: 传引用更加高效 缺省情况下,C++ 以传值方式将对象传入或传出函数。除非你特别指定其它方式,否则函数的参数就会以实际参数的拷贝进行初始化,而函数的调用者会收到函数返回值的一个拷贝。这个拷贝由对象的拷贝构造函数生成。这就使得传值成为一个代价不菲的操作。 例如,考虑下面这个类层级结构: 考虑以下代码,在 阅读全文
posted @ 2020-02-08 16:55 刘-皇叔 阅读(260) 评论(0) 推荐(0) 编辑
摘要: 类设计时的思考 实际上每一个类都需要你面对下面这些问题: 新的类型的对象应该如何创建和销毁? 影响构造函数,析构函数的设计。 影响内存分配和回收函数(operator new,operator new[],operator delete,operator delete[])的设计。 对象的初始化和对 阅读全文
posted @ 2020-02-08 16:12 刘-皇叔 阅读(117) 评论(0) 推荐(0) 编辑