改善程序与设计的55个具体做法 day1
博客好久没更新了,就从这本读书笔记开始吧。
条款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代替宏定义很容易理解, 另外该条款中提到了在类内部使用声明式声明一个成员变量而省去在cpp文件中定义的方式,即
static const int/char/unsigned 等整数类型的const static 成员变量可以省去在cpp文件中的定义,还有一个约束就是不去取该成员的地址。
2、使用enum代替宏定义时,可以在类内部使用一个匿名枚举代替宏定义的常量,比如作为数组大小时使用。
3、使用inline代替宏定义,这一点主要是说的函数宏定义
使用宏定义函数时,好处是省去函数调用的开销,缺点也很明显,比如定义结构不清晰,参数求值的副作用等等。
条款03:尽可能使用const
const可以用来修饰 指针 / 迭代器 / 引用 / 参数 / 返回值 / 函数类型
尽可能的使用const可以借助编译器检查出一些编译阶段的错误。
当const成员函数和非const成员函数有着实质等价的实现时,用非const版本调用const版本可以避免代码重复。
编译器强制实时【二进制常量】,例如const成员变量不会允许被赋值。 而【逻辑上的常量】需要自己根据实际情况来决定。
条款04:确定对象使用前已被初始化
内置类型成员变量的初始化、类对象成员的成员变量的初始化等,建议都是用初始化列表进行初始化,使用初始化而非赋值。
在初始化列表中进行初始化的的顺序:基类优先、其他成员按照在类中声明的次序。
关于:non-local static对象
a.cpp
static CObject s_obj; // 非局部静态对象
b.cpp
在b.cpp中使用对象s_obj时,不能保证在使用的时候,s_obj对象一定被初始化了。
可以改为如下
a.cpp
CObject& GetObject()
{
static CObject s_obj;
return s_obj;
}
b.cpp
调用GetObject() 获取s_obj对象。
改善程序与设计的55个具体做法 day1的更多相关文章
- 改善程序与设计的55个具体做法 day9
条款23:宁以non-member.non-friend替换member函数 即 以非成员函数 非友元函数 替换成员函数. 直观上,面向对象应该尽可能的封装,封装数据.封装操作等等,所以这个条款可能有 ...
- 改善程序与设计的55个具体做法 day7
条款18:让接口容易被正确使用,不易被误用 这里说的接口是广义上的接口,即包括但不限于函数接口.类接口.template接口等,每一种接口都是客户与你的代码进行交互的手段. 我们对客户的所谓“资质或水 ...
- 改善程序与设计的55个具体做法 day3
条款07:为多态基类声明virtual析构函数 任何一本C++语法教材上都会讲这一点(如果没讲,扔掉它),这么做到原因是可以让delete pBase操作能够正确的执行子类的析构函数. 需要说明的是当 ...
- 改善程序与设计的55个具体做法 day8
条款20:宁以pass-by-reference-to-const 替换 pass-by-value 即 以const引用 替换值传递. 采用引用传递参数时,底层往往是用指针方式实现,因此参数传递内置 ...
- 改善程序与设计的55个具体做法 day6
条款13:以对象管理资源 资源,包括但不限于内存.句柄.GDI对象.数据库连接等. 内存要记得释放,句柄要记得closehandle, GDI对象要记得删除,数据库连接要记得关闭,等等等等. 以对象来 ...
- 改善程序与设计的55个具体做法 day5
条款12:复制对象时勿忘其每一个成分 这里的复制是拷贝构造和operator= 每一个成分有几个维度: 1.每个成员变量 这个很好理解,添加新的成员时也要记得为每个新添加的成员执行合适的复制操作 2. ...
- 改善程序与设计的55个具体做法 day4
今天晚上回到小区门口,买了点冬枣,要结账的时候想起来,钥匙没带,落公司了! TNND,没办法再回趟公司,拿了钥匙,来回一个小时,汗~ 条款10:令operator=返回一个reference to * ...
- 改善程序与设计的55个具体做法 day2
条款05:了解C++默默编写并调用哪些函数 如果没有为类定义构造函数.析构函数.拷贝构造函数.重载赋值操作符,并且这些函数被需要(调用)时,编译器会为类生成默认的函数,而这些函数是public inl ...
- 重构HTML改善web应用设计
本文从良构,有效性,布局三个角度,结合往日项目开发经历, 整理总结重构HTML改善Web应用设计的几点规则和做法.部分参考自<重构HTML改善Web应用设计>. 重构.什么是重构?为什么要 ...
随机推荐
- smartsvn学习(三) Error validating server certificate for
Error validating server certificate for 'xxxxxxxxxxxx:443': - The certificate is not issued by a tr ...
- 线段树专题—ZOJ1610 Count the Colors
题意:给一个n,代表n次操作,接下来每次操作表示把[l.r]区间的线段涂成k的颜色当中,l,r,k的范围都是0到8000 分析:事实上就是拿线段树维护一段区间的颜色,整体用到的是线段树的区间更新把,可 ...
- Synchronized与ReentrantLock的区别
1.ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候 线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O ...
- 2016.6.20 tomcat安装出现No Java Virtual Machine found in..
安装tomcat时,选择安装路径为自定义路径,但是出现提示: No Java Virtual Machine found in.. 心想这和java虚拟机什么关系啊.百度了之后发现,安装过程中有一步是 ...
- eclipse离线安装插件过程
离线安装插件: 1. help -> install New Softe.. 2. 打开安装插件界面 最后点击,next, 同意事项,重启eclipse.
- struts2学习笔记2 -struts2的开发步骤和工作原理
struts2的开发步骤: 1.先定义一个能发送请求的页面,可以是链接,也可以是表单(form) 2.开发action类,struts2对action并没有过多的要求,只要求: a 推荐实现actio ...
- 2016年蓝桥杯C/C++B组
第一次參加蓝桥杯.也是有非常多感触的,时间全然不够写最后一题... 最后一题没做...还有全排序非常重要... 1. 煤球数目 有一堆煤球,堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三 ...
- Shell脚本之:for
与其他编程语言类似,Shell支持for循环. for循环一般格式为: for 变量 in 列表 do command1 command2 ... commandN done 列表是一组值(数字.字符 ...
- jquery插件范例代码
// 创建一个闭包 (function($) { // 插件的定义 $.fn.hilight = function(options) { debug(this); // build main opti ...
- HttpRuntime Cache用法及参数解释
自己用到的: HttpRuntime.Cache.Insert("SchoolBindKcChangci", SchoolBindKcChangci, null, DateTime ...