条款12:复制对象时勿忘其每一个成分 这里的复制是拷贝构造和operator= 每一个成分有几个维度: 1.每个成员变量 这个很好理解,添加新的成员时也要记得为每个新添加的成员执行合适的复制操作 2.每个基类的成员变量 在子类中调用可以调用基类的拷贝构造函数或者operator= e.g. class CObject : public CBase {}; CObject::CObject(const CObject& obj) : CBase(obj), val(obj.val){} CObje…
条款23:宁以non-member.non-friend替换member函数 即 以非成员函数 非友元函数 替换成员函数. 直观上,面向对象应该尽可能的封装,封装数据.封装操作等等,所以这个条款可能有悖常理. 比如一个类成员函数CObj::Func(){ Dosomething(); } 该函数会调用其他成员函数做一点微小的工作,想一下把成员函数换成普通函数Func2(const CObj& obj); Func2(const CObj& obj) { obj.Dosomething();…
条款18:让接口容易被正确使用,不易被误用 这里说的接口是广义上的接口,即包括但不限于函数接口.类接口.template接口等,每一种接口都是客户与你的代码进行交互的手段. 我们对客户的所谓“资质或水平”做出假设或要求,因此面对不同的客户,需要接口在形式上有足够的易用性以及足够的不被误用性. e.g. CDate(int year, int month, int day) 该类CDate的构造函数为三个int参数,分别代表年月日.客户在使用的时候很容易用错,比如写错顺序.写的日期不合法等,比较好…
条款07:为多态基类声明virtual析构函数 任何一本C++语法教材上都会讲这一点(如果没讲,扔掉它),这么做到原因是可以让delete pBase操作能够正确的执行子类的析构函数. 需要说明的是当一个类不是用来当作基类或者不是用来在多态场景下使用时,就不要为这个类的析构函数声明为virtual的,因为这会额外给这类加大体积. 条款08:别让异常逃离析构函数 别让析构函数中产生异常,如果非要产生则要么吞下(不传播),要么结束程序. 如果某个操作可能会抛出异常,则应该让其在一个普通函数中执行,而…
条款20:宁以pass-by-reference-to-const 替换 pass-by-value 即 以const引用 替换值传递. 采用引用传递参数时,底层往往是用指针方式实现,因此参数传递内置类型时,采用值传递方式往往效率更高. 如果函数参数是基类对象(值传递),传递实参时如果传递的是派生类对象,则可能会产生[切割现象]:而如果形参是const 基类引用,则不会有这个问题. 请记住: a 尽量以const引用 代替 值传递,通常前者效率较高,并且没有切割问题. b 以上规则并不适用于内置…
条款13:以对象管理资源 资源,包括但不限于内存.句柄.GDI对象.数据库连接等. 内存要记得释放,句柄要记得closehandle, GDI对象要记得删除,数据库连接要记得关闭,等等等等. 以对象来管理这些资源就是利用 对象的构造和析构 特性,在构造函数中获得资源并在析构函数中释放资源. 两个智能指针auto_ptr 和 std::tr1::shared_ptr,前者同一时刻只能指向同一个资源,赋值的一方不再指向这个资源,被赋值的一方指向这个资源.在析构函数中对对象调用delete(而不是de…
今天晚上回到小区门口,买了点冬枣,要结账的时候想起来,钥匙没带,落公司了! TNND,没办法再回趟公司,拿了钥匙,来回一个小时,汗~ 条款10:令operator=返回一个reference to *this 即赋值操作符返回引用. 原型 Object& operator=(const Object& obj) 同时,该协议还适用于所有的赋值操作. Object& operator=(int a)等形式 条款11:在operator=中处理“自我赋值” 即 Object&…
条款05:了解C++默默编写并调用哪些函数 如果没有为类定义构造函数.析构函数.拷贝构造函数.重载赋值操作符,并且这些函数被需要(调用)时,编译器会为类生成默认的函数,而这些函数是public inline的. 需要主意的是带引用成员的类和带const成员的类. 带引用成员的类,如果不为其主动编写operator=,则对象之间的赋值操作是不能编译通过的: 带const成员的类,如果不为其编写operator=,则对象之间的赋值是不能通过编译的. 条款06:若不想使用编译器自动生成的函数,就该明确…
博客好久没更新了,就从这本读书笔记开始吧. 条款01: 视C++为一个语言联邦 C++可视为有四个次语言组成的: 1.C语言 2.Object-Oriented C++ (面向对象C++) 3.Template C++(模版C++) 4.STL (标准模版库) 条款02:尽量以const, enum, inline替换#define 该条款中提到的const, enum, inline 替换#define主要是两个维度. 一个是数据,一个是函数. 1.使用const代替宏定义很容易理解, 另外该…
本文从良构,有效性,布局三个角度,结合往日项目开发经历, 整理总结重构HTML改善Web应用设计的几点规则和做法.部分参考自<重构HTML改善Web应用设计>. 重构.什么是重构?为什么要重构. 重构是在不改变程序行为的基础上进行小的改动,是代码逐渐改善的过程.移除长期累积下来的烂码,以得到更清晰和更容易维护,除错以及添加新功能的代码,这做法不能单纯只出现在编码的后期,甚至是你意识到你的代码已经无从再下手非重写不可的时候,而是从开始开发起,逐渐积累,逐渐修改.以前因为日常编码的随意性,导致问题…