![](https://img-blog.csdnimg.cn/20191021133612653.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
More Effective C++
xupeng1644
道阻且长,行则将至!
展开
-
10. 在constructors内阻止资源泄露
如果在构造函数中抛出了一个异常,那么需要确保抛出异常前申请的资源能够被释放。这里不能期待析构函数来帮忙释放资源。因为面对尚未完全构造好的对象,C++拒绝调用其析构函数。因为析构函数不知道如果去析构,哪些成员已经构造好需要析构,哪些没有构造好不需要析构。如果需要使析构函数有这个能力,又会导致构造函数臃肿不堪,同时会降低构造函数的速度与效率,使每一个对象更加庞大。由于C++不自动清理那些"构造期间抛...原创 2019-12-03 21:34:26 · 1162 阅读 · 0 评论 -
11. 禁止异常(exceptions)流出destructors之外
两种情况下destructor会被调用:a. 当对象在正常状态下被销毁,也就是当它离开它的生存空间或是被明确地删除。b. 当对象被异常处理机制销毁,也就是异常传播过程中的栈展开机制过程中(异常向上传递)。为什么需要禁止异常流出destructors?a. 防止erminate函数被调用导致进程退出。如果在析构函数中不捕获异常,它会被传播到调用点。如果同时这个析构函数本身就是由于其他某个异常...原创 2019-12-04 10:30:31 · 1467 阅读 · 0 评论 -
09. 利用destructors避免泄漏资源
将资源(主要指new出来的堆内存)保存在一个对象中,只要对象析构,就会delete掉该资源。避免直接使用资源过程中抛出异常导致的内存泄漏问题。参考智能指针std::shared_ptr和std::unique_ptr。...原创 2019-11-30 13:46:43 · 1357 阅读 · 0 评论 -
08. 了解各种不同意义的new和delete
待添加原创 2019-11-30 12:41:10 · 1367 阅读 · 0 评论 -
07. 千万不要重载&&、||和, 操作符
为什么不能重载&&、||对于&&和||操作符,存在"骤死式"评估方式例如if (expression1 && expression2),如果expression1为false,不会计算expression2。对于if (expression1 || expression2),如果expression1 为true,不会计算expression2...原创 2019-11-29 17:30:15 · 1487 阅读 · 0 评论 -
06. 区分increment/decrement操作符的前置(prefix)和后置(postfix)形式
class UPint{public: UPint& operator ++ (); // 前置版本 const UPint operator ++ (int); // 后置版本, 参数名不需要,因为根本不会使用该参数}调用如下:UPint i;++i;i++;++i实际的调用为i.operator++(); i++实际的调用为i.operator++(0)。(0由...原创 2019-11-29 13:06:41 · 1450 阅读 · 0 评论 -
05. 对定制的"类型转换函数"保持警觉
C++允许编译器在不同类型之间执行隐式类型转换(implicit conversions)。两种函数允许编译器执行这样的转换:单自变量constructors隐式类型转换操作符单自变量constructors单自变量constructors是指能够以单一自变量成功调用的constructors。如此的constructor可能拥有单一参数,也可能声明拥有多个参数,并且除了第一个参...原创 2019-11-27 20:44:08 · 1341 阅读 · 0 评论 -
04. 非必要不提供default constructor
在一个完美的世界中,凡是可以"合理地从无到有生成对象"的classes,都应该内含default constructors。而"必须有某些外来信息才能生成对象"的classes,则不必拥有default constructors。但是,不过class缺乏一个default constructor,使用这个class时会存在某些限制。在产生数组的时候,没有办法为数组中的对象指定constr...原创 2019-11-27 13:01:56 · 1427 阅读 · 0 评论 -
03. 绝对不要以多态(polymorphically)方式处理数组
继承的最重要性质之一就是:可以通过"指向base class objects"的pointers和references,来操作derived class objects。如此的pointers和references,其行为是多态的。有如下例子:class BST{...};class BalanceBST : public BST{...};考虑有个函数,打印BSTs数组中的每一个B...原创 2019-11-26 19:17:31 · 1407 阅读 · 0 评论 -
02. 最好使用C++转型操作符
旧式转型的缺点:旧式的C转型方式并非是唯一选择。它几乎允许任何类型转换为其他类型,这是十分拙劣的。如果每次转型都能够更精准地指明意图,则更好。旧式转型难以辨别。旧式转型的语法结构是由一对小括号加上一个对象名称(标识符)组成,而小括号和对象名称在C++的任何地方都有可能被使用。为了解决C旧式转型的缺点,C++引入了4种新的转换操作符:static_caststatic_cast基本拥有...原创 2019-11-26 18:42:41 · 1357 阅读 · 0 评论 -
01. 仔细区分pointer和references
没有所谓的null reference。一个reference总是代表某个对象如果有一个变量,其目的是用来指向(代表)另外一个对象,但是也有可能不指向(代表)任何对象,应该使用pointer,因为可以将pointer设为null。如果这个变量总是代表一个对象,即并不允许这个变量为null,应该使用reference。由于reference一定代表某个对象,C++要求reference必须有初值...原创 2019-11-25 17:29:15 · 1196 阅读 · 0 评论 -
八 理解各种不同含义的new和delete
一 new操作符和delete操作符的实质new操作符,也即 new operator。当使用new创建堆对象时,实质是:1. 使用operator new运算符进行分配(申请)内存。2. 调用构造函数在该内存上进行对象创建。delete操作符,也即delete operator。当使用delete删除对象时,实质是:1.调用析构函数销毁该对象。2.使用o原创 2015-08-12 20:12:48 · 416 阅读 · 0 评论