EC++学习笔记(五) 实现
条款26:尽可能延后变量定义式的出现时间
尽可能延后变量的定义,知道非得使用该变量的前一刻为止
方法A:
Widget W;
for (int i = ; i < n; ++i) {
W = ...
}
方法B:
for (int i = ; i < n; ++i) {
Widget W;
}
方法A:一个构造函数 + 一个析构函数 + n个赋值操作
方法B:n个构造函数 + n个析构函数
条款27:尽量少做转型
const_cast<T>(expression):唯一可以将对象的常量性移除(将 const 转 non-const)
dynamic_cast<T>(expression):除单元测试可以使用以外,其余情况禁用
reinterpret_cast<T>(expression): 指针类型的转型,较少使用
static_cast<T>(expression):显式转型,最常用,c++中禁用C语言旧式转型方法
强制函数调用使用虚函数的特定版本(规避多态执行),请使用作用域操作符:
virtual void Derived::func(int x) {
...
Base::func(x); //强制使用Base类里的函数
}
派生类虚函数调用基类版本时,必须显式使用作用域操作符
条款28:避免返回handle(reference、pointer、iterator)指向对象内部成分(注意不是函数体内的local变量)
遵守这条规则,可以增加封装性,规避潜在风险
条款29:为"异常安全"而努力是值得的
class PrettyMenu{
public:
void ChangeBackground(std::istream& imgsrc); //改变图像背景
private:
Mutex* mutex; //互斥器
Image* image; //目前的图像背景
int imageChange; //背景图像被改变的次数
}; void PrettyMenu::ChangeBackground(std::istream& imgsrc) {
lock(&mutex); //取得互斥器
delete image; //摆脱旧的背景图像
++imageChange; //改变图像更改次数
image = new Image(imgsrc); //安装新的背景图像
unlock(&mutex); //释放互斥器
}
上面函数没有异常安全性,因为异常安全性函数:
不泄漏任何资源:上述代码中当 new Image 发生异常时,互斥器就永远不会释放
不允许数据败坏:上述代码中当 new Image 发生异常时, imageChange已经被累加,其实新的背景图像并没有成功安装
任何使用动态内存的东西(例如所有STL容器)如果无法找到足够内存满足需求,通常会抛出一个 bad_alloc 异常
对于上述代码,我们使用对象来管理资源(image和mutex):
class PrettyMenu{
public:
void ChangeBackground(istream& imgsrc);
private:
std::shared_ptr<Image> bgImage;
}; void PrettyMenu::ChangeBackground(std::istream& imgsrc) {
Lock m1(&mutex);
bgImage.reset(new Image(imgsrc));
++imageChange;
}
条款30:透彻了解 inline 的里里外外
类的成员函数在类内定义时该函数默认为 inline 函数
inline 函数通常位于头文件内
一个表面看似 inline 的函数是否真的是 inline,取决你的 build environment,主要取决于编译器
inline 是个申请,编译器可以加以忽略,大部分编译器拒绝将太过复杂的函数、virtual 函数 inline
编译器通常不对"通过函数指针而进行的调用"实施 inline
可以联想 自定义比较函数comp通过函数指针传递给sort,实际上指针调用未inline,故sort比qsort快
将大多数 inline 限制在小型(小于10行)被频繁调用的函数身上(注意构造函数、析构函数、虚函数、递归函数通常不能 inline)
条款31:将文件间的编译依存关系降至最低
如果一个foo.cc文件,则最佳的头文件排序方式:(可有效减少隐藏依赖)
foo.h(即源文件对于的头文件)
C语言标准库头文件
c++语言标准库头文件
windows头文件(或者unix头文件)
MFC头文件(或者posix头文件)
第三方项目头文件(例如Google开源代码头文件、boost头文件)
本项目其他头文件
使用pimpl(pointer to implementation)手法,将接口与实现分离,以"声明的依存性" 替换 “定义的依存性”
EC++学习笔记(五) 实现的更多相关文章
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- (转)Qt Model/View 学习笔记 (五)——View 类
Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor
目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...
- python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍
python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...
- Go语言学习笔记五: 条件语句
Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...
随机推荐
- ssh复制remote
rsync rsync localdirectory username@10.211.55.4:/home/username/Downloads/localdirectory -r
- socket的BeginConnect(EndPoint remoteEP,AsyncCallback callback,objcet state);个人理解
1.socket.BeginConnect(); 其中的三个参数值EndPoint remoteEP,这个是用来指定连接的socket服务器的的地址 socket参数表 EndPoint remote ...
- 想转行做web前端工程师,必学这5大技能!知道是那些吗?
web前端工程师是近几年才发展出来的新兴职业,也是目前火爆且高薪的职业. 大需求的市场环境下,出现了越来越多的人群转行做web前端工程师,如设计师.后台程序员.网虫.大学其他专业.策划.编辑等等. 要 ...
- https 调用验证失败 peer not authenticated
https 调用验证失败 peer not authenticated 报错日志: Caused by: javax.net.ssl.SSLPeerUnverifiedException: peer ...
- C++简单年月日的功能实现
// C++年月日判断初步代码 #include <iostream> using namespace std; class Data { int year; int month; int ...
- 身为前端开发工程师,你需要了解的搜索引擎优化SEO.
网站url网站创建具有良好描述性.规范.简单的url,有利于用户更方便的记忆和判断网页的内容,也有利于搜索引擎更有效的抓取您的网站.网站设计之初,就应该有合理的url规划. 处理方式: 1.在系统中只 ...
- pycharm添加wordcloud模块时报错:error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
windows 7 32bit python3.6.3 32bit pycharm2018社区版 32bit 问题说明: 添加wordcloud模块时报错:error: Microsoft Visua ...
- wordpress配置SMTP服务发送邮件(qq邮箱)
wordpress有一个注册功能,填了用户名和邮箱后,会收到一封邮件,邮件里有一个链接,点击该链接可以获得密码和修改密码.但是,最开始,你会发现,等半天都没有收到邮件,再等到猴年马月也不会收到. 但是 ...
- 在 shell中, 我們可用 $0, $1, $2, $3 ... 這樣的变量分別提取命令行中变量
代码: script_name parameter1 parameter2 parameter3 ...我們很容易就能猜出 $0 就是代表 shell script 名称(路径)本身,而 $1 就是其 ...
- POJ 2955 区间DP Brackets
求一个括号的最大匹配数,这个题可以和UVa 1626比较着看. 注意题目背景一样,但是所求不一样. 回到这道题上来,设d(i, j)表示子序列Si ~ Sj的字符串中最大匹配数,如果Si 与 Sj能配 ...