条款1:视C++为一个语言联邦

记住:

  ★C++高效编程守则视状况而变化,这取决于你使用C++的哪一部分

    C;

    Object-oriented c++;

    Template c++;

    STL

条款2:尽量以constenuminline替换#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 constnon-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的更多相关文章

  1. EC读书笔记系列之12:条款22、23、24

    条款22 将成员变量声明为private 记住: ★切记将成员变量声明为private.这可赋予客户访问数据的一致性.可细微划分访问控制.允诺约束条件获得保证,并提供class作者以充分的实现弹性. ...

  2. EC读书笔记系列之16:条款35、36、37、38、39、40

    条款35 考虑virtual函数以外的其他选择 记住: ★virtual函数的替代方案包括NVI手法及Strategy模式的多种形式.NVI手法自身是一个特殊形式的Template Method模式 ...

  3. EC读书笔记系列之20:条款53、54、55

    条款53 不要轻忽编译器的警告 记住: ★严肃对待编译器发出的警告信息.努力在你的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉 ★不要过度依赖编译器的报警能力,∵不同的编译器对待事情的态度 ...

  4. EC读书笔记系列之19:条款49、50、51、52

    条款49 了解new-handler的行为 记住: ★set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用 ★Nothrow new是一个颇为局限的工具,∵其只适用于内存 ...

  5. EC读书笔记系列之18:条款47、48

    条款47 请使用traits classes表现类型信息 记住: ★Traits classes使得“类型相关信息”在编译期可用.它们以templates和“templates特化”完成实现 ★整合重 ...

  6. EC读书笔记系列之17:条款41、42、43、44、45、46

    条款41 了解隐式接口与编译器多态 记住: ★classes和templates都支持接口和多态 ★对classes而言接口是显式的(explicit),以函数签名为中心.多态则是通过virtual函 ...

  7. EC读书笔记系列之15:条款32、33、34

    条款32 确保你的public继承塑模出is-a关系 记住: ★public继承意味着is-a.适用于base class身上的每一件事情一定也适用于derived class身上,∵每一个deriv ...

  8. EC读书笔记系列之14:条款26、27、28、29、30、31

    条款26 尽可能延后变量定义式的出现时间(Lazy evaluation) 记住: ★尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率 ----------------------- ...

  9. EC读书笔记系列之11:条款20、21

    条款20 宁以pass-by-reference-to-const替换pass-by-value 记住: ★尽量以pass-by-reference-to-const替换pass-by-value.前 ...

随机推荐

  1. JAVA 对象引用,以及对象赋值(转)

    原文链接:http://zwmf.iteye.com/blog/1738574 关键字: java对象 引用 Java对象及其引用 关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里 ...

  2. win8 Pro 64位在 UEFI模式下Ghost系统 备份 恢复

    一:在win8 安装U 盘中  1. 新建 “Ghost” 文件夹 2. 将下载的Ghost64.exe 文件拷贝到文件夹  二: 启动的时候 按下F12 选择 HDDUSB 1.Windows 安装 ...

  3. IntelliJ IDEA启动web项目时突然变慢的原因

    在使用IntelliJ IDEA开发web项目过程中,有两次项目启动非常慢,大约要200s的时间: 第一次忘记是怎么解决的,第二次出现后,我就直接重新下载了代码,然后部署,启动,时间有恢复正常,只用了 ...

  4. Android再学习-20140928-布局

    关于布局中的单位 PX是像素,这个没有问题.另外还有两个单位,一个是dp,这个是个相对单位,在任何分辨率的屏幕上显示效果是一样的,所以用dp来进行控件的大小设置.另外,字体的设置推荐用sp,这样字体可 ...

  5. Python学习笔记整理(四)Python中的字符串..

    字符串是一个有序的字符集合,用于存储和表现基于文本的信息. 常见的字符串常量和表达式 T1=‘’ 空字符串 T2="diege's" 双引号 T3=""&quo ...

  6. 联通3g彩信设置

    手机ME865,安卓2.3.6 添加接入点名称:3gwapAPN:3gwap代理:10.0.0.172端口:80服务器:http://www.wo.com.cnMMSC:http://mmsc.myu ...

  7. 开心菜鸟系列----变量的解读(javascript入门篇)

                       console.info(         console.info(window['weiwu'])          console.info(window. ...

  8. android run process

    http://www.jb51.net/article/32798.htm http://www.elecfans.com/tongxin/119/20120315263977.html 图 1 详细 ...

  9. Linux上的设备管理器

    一般windows上我们用它自带的“设备管理器”来查看,管理,安装,卸载驱动. 那么问题来了,Linux上用什么命令来看呢? 可以用: lshw   lsusb lspci lsmod 查看特定模块. ...

  10. 2015第14周日WebSocket

    清明时节雨纷纷,路上行人欲断魂,借问酒家何处是?牧童遥指杏花村.每次清明都不禁想起杜牧这首诗缅怀先人,此时第一句写时间天气,第二句写人物心情,第三句写解决方法,第四句给出解决方案,脍炙人口. 刚没事看 ...