EC读书笔记系列之1:条款1、条款2、条款3
条款1:视C++为一个语言联邦
记住:
★C++高效编程守则视状况而变化,这取决于你使用C++的哪一部分
C;
Object-oriented c++;
Template c++;
STL
条款2:尽量以const,enum,inline替换#define
记住:
★对于单纯常量,最好以const对象或enums替换#define
★对于形似函数的宏,最好改用inline函数替换#define
------------------------------------------------------------------------------------------------------
延伸:面试时经常会被问到的一个典型问题是:参数宏与函数的区别,我想可以从如下几个角度来回答:
a 函数调用要先求出实参表达式的值,然后代入形参;宏只是字符替换;
b 宏替换只占编译时间;函数调用占运行时间;
c 函数运行时可调试,宏不可;
d 函数会做参数类型检查,宏不会;
e 使用宏次数多时宏展开后源程序变长;函数调用不会;
条款3:尽可能使用const
记住:
★将某些东西声明为const可帮助编译器侦测出错误用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体
★编译器强制实施bitwise constness,但你写程序时应使用“概念上的常量性”(conceptual constness)
★当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复
----------------------------------------------------------------------------------------------------------------------
1 一条规则:
const出现在*左,表示被指物是常量: const int *p = NULL;
*右, 指针自身是常量:int *const p = NULL;
*两边, 两者都是常量:const int *const p = NULL;
对于被指物是常量的情形,const 写在类型前后无关:const int *p 等价于 int const *p
2 STL迭代器中const的用法:
迭代器自身是const的用法: const std::vector<int>::iterator iter = vec.begin();
*iter = 10; //可以,改变iter所指之物
++iter; //错误,iter自身是const
迭代器所指之物是const的用法:std::vector<int>::const_iterator cIter = vec.begin();
*cIter = 10; //错,*cIter是const
++cIter; //没问题,cIter本身可以变化
3 const成员函数
将const实施于成员函数的目的是为了确认该成员函数可作用于const对象身上。这类成员函数重要的两个原因:
一、使class接口较容易被理解。因为可得知哪个函数可改动对象内容而哪个不行很是重要;
二、使“操作const”对象成为可能。
4 bitwise constness(或physical constness)和logical constness
利用mutable可释放掉non-static成员变量的bitwise constness约束
5 在const和non-const成员函数中避免重复
利用const成员函数实现出其non-const成员函数:举例:
class TextBlock {
...
const char& operator[]( std::size_t position ) const { //const版本
...
...
...
return text[position];
} char& operator[]( std::size_t position ) { //用const实现的non-const版本 return
const_cast<char&>( static_cast<const TextBlock&>(*this)[position] //转换后调用const版[]
);
} ...
}
理解:这份代码有两个转型动作
一、将*this从其原始类型TextBlock&转型为const TextBlock&(这使得接下来调用operator[]时得以调用const版本成员函数)
二、从const operator[]的返回值中移除const
最后需要注意:non-const成员调用const成员可以,但反之不行!!!
EC读书笔记系列之1:条款1、条款2、条款3的更多相关文章
- EC读书笔记系列之12:条款22、23、24
条款22 将成员变量声明为private 记住: ★切记将成员变量声明为private.这可赋予客户访问数据的一致性.可细微划分访问控制.允诺约束条件获得保证,并提供class作者以充分的实现弹性. ...
- EC读书笔记系列之16:条款35、36、37、38、39、40
条款35 考虑virtual函数以外的其他选择 记住: ★virtual函数的替代方案包括NVI手法及Strategy模式的多种形式.NVI手法自身是一个特殊形式的Template Method模式 ...
- EC读书笔记系列之20:条款53、54、55
条款53 不要轻忽编译器的警告 记住: ★严肃对待编译器发出的警告信息.努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉 ★不要过度依赖编译器的报警能力,∵不同的编译器对待事情的态度 ...
- EC读书笔记系列之19:条款49、50、51、52
条款49 了解new-handler的行为 记住: ★set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用 ★Nothrow new是一个颇为局限的工具,∵其只适用于内存 ...
- EC读书笔记系列之18:条款47、48
条款47 请使用traits classes表现类型信息 记住: ★Traits classes使得“类型相关信息”在编译期可用.它们以templates和“templates特化”完成实现 ★整合重 ...
- EC读书笔记系列之17:条款41、42、43、44、45、46
条款41 了解隐式接口与编译器多态 记住: ★classes和templates都支持接口和多态 ★对classes而言接口是显式的(explicit),以函数签名为中心.多态则是通过virtual函 ...
- EC读书笔记系列之15:条款32、33、34
条款32 确保你的public继承塑模出is-a关系 记住: ★public继承意味着is-a.适用于base class身上的每一件事情一定也适用于derived class身上,∵每一个deriv ...
- EC读书笔记系列之14:条款26、27、28、29、30、31
条款26 尽可能延后变量定义式的出现时间(Lazy evaluation) 记住: ★尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率 ----------------------- ...
- EC读书笔记系列之11:条款20、21
条款20 宁以pass-by-reference-to-const替换pass-by-value 记住: ★尽量以pass-by-reference-to-const替换pass-by-value.前 ...
随机推荐
- hdu Intelligent IME
算法:字典树 题意:手机9键拼音:2:abc 3:def 4:ghi 5:jkl 6:mno 7:pqrs 8:tuv 9:wxyz: 第一行读入一个T,代表测试组数: 之后输入两个整数n和m, 有 ...
- 制作 leanote docker 镜像
leanote 使用 mongodb 存储数据,如果把 mongodb 单独做成一个镜像,初始化数据时比较麻烦,所以最后还是决定把 mongodb 和 leanote 放到同一个镜像里边. docke ...
- 一个人的旅行--hdu2066
一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- Excel——使用VLOOKUP函数关联跨工作薄数据
实验环境 有两个工作簿,一个是<花名册>,另一个是<入离职表>,<花名册>上有所有员工的详细信息,包括员工的姓名.部门.出生日期等,<入离职表>上有离职 ...
- IOS开发笔记(4)数据离线缓存与读取
IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...
- [TYVJ] P1015 公路乘车
公路乘车 描述 Description 一个特别的单行街道在每公里处有一个汽车站.顾客根据他们乘坐汽车的公里使来付费.例如样例的第一行就是一个费用的单子. 没有一辆车子行驶超过10公里,一个顾客打算行 ...
- OpenSceneGraph是一个开源的三维引擎
http://www.osgchina.org/OpenSceneGraph是一个开源的三维引擎,被广泛的应用在可视化仿真.游戏.虚拟现实.科学计算.三维重建.地理信息.太空探索.石油矿产等领域.OS ...
- Could not find qmake configuration file win32-g++
D:\Source>c:\Qt\Qt5.3.2_static\bin\qmake -makefile -o Makefile my.proCould not find qmake configu ...
- Android-PullToRefresh 使用心得
目前下拉刷新已经满大街都是,在自己的应用如果不使用这个模式的话,出门都不好意思和人家打招呼,该文章就是简单探讨下针对于 github 上的这个开源项目的使用心得. 为什么是它?因为在 stackove ...
- java设计模式--结构型模式--享元模式
享元模式 概述 运用共享技术有效地支持大量细粒度的对象. 适用性 当都具备下列情况时,使用Flyweight模式: 1.一个应用程序使用了大量的对象. 2.完全由于使用大量的对象,造成很大的存储开销. ...