条款01:把C++看作一个语言联邦

C++是一种多重范型编程语言,一个同时支持过程(procedural),面向对象(object-oriented),函数形式(functional),泛型形式(generic),元编程(metaprogramming)的语言

1、c part of  C++,c++时以c为基础发展起来的,完全兼容于c语言

2、object-oriented C++,面向对象的封装、继承、多态等三大特性,C++都能够很好支持

3、template C++,使得C++支持泛型编程

4、STL,STL是个标准模板库,它对容器,迭代器,算法,函数对象等进行了封装,使得使用者能够直接调用

注意:

由于C++存在以上四种多重范型编程,故使用时注意不同语言层次,进行高效编程的原则也会存在差异

条款02:尽量以const、enum、inline替换#define

该条款从宏观工具来说也可以为:尽量用编译器代替预处理器

1、对于引用接口头文件中的宏,在编译时若是异常,使用者很难追踪到问题源头;因宏直接被替换,到编译时候,其名称只存在于预编译阶段,而不会进入编译阶段的的符号表中;

2、const常量能够比#define产生更轻量的代码,因#define定义的变量在替换时候会产生多个副本,而const则不会

3、const支持变量限定作用域,而#define则总是全局有效

4、对于class专属常量,对于有的编译器,其定义域声明同普通成员变量的声明一致,且可以同事给予赋值;对于有的编译器则不行,必须按照函数定义的形式给以赋值;如果变量的值必须在声明时要求给定(如该变量将作为类成员变量数组成员的大小)

class GamePlayer

{

private:

  static const int NumTurns = 5;

  int Scores[NumTurns];

}

若编译器不允许声明时给NumTurns赋值,则可借助枚举进行规避,

class GamePlayer

{

private:

  enum { NumTurns = 5 };

  int Scores[NumTurns];

};

此处的枚举变量与常量的区别在于:常量可以取地址,而枚举变量不能够取地址

总结:

1、对于单纯变量,最好以const对象或enums替换#defines

2、对于形似函数的宏(宏函数),最好改用inline函数替换#defines

条款03:尽可能使用const

1、如果const出现在*左侧,则表示指针所指物为常量,若const出现在*右侧,则表示指针本省为常量

2、在一个函数声明式中,const可以和函数返回值、个个参数、函数自身(若为成员函数)产生关联,

若将返回值申明为const则可以避免a*b = c 类似的错误

若将不改变的变量声明为const 可以避免if(a = 0)类似的错误

3、const成员函数的优点:

  a、它使得成员函数更容易被理解,很容易得知哪个函数可以改动对象内容而哪个函数不可以

  b、它们是操作“const 对象”成为可能,是pass by reference to const方式传递对象得技术前提

  c、两个成员函数如果只是常量性不同,可以被重载

class TextBlock
{
public:
const char& operator[](std::size_t position) const
{ return text[position];}
char& operator[](std::size_t position)
{ return text[position]; }
private:
std::string text;
} TextBlock tb("Hello");
std::cout << tb[]; //调用非const operator[] const TextBlock ctb("Hello")
std::cout << ctb[] //调用const operator[] void print(const TextBlock& ctb)
{
std::cout << ctb[];
}

4、bitwise constness 和 logical constness

  a、bitwise通过检查函数内有无赋值操作来判定;为了保证bitwise的常量性,不允许在const函数中存在为non-static成员变量赋值得操作,为了破除这种限制,需要在non-static变量申请时,添加mutable关键字 mutable std::size_t textLength;

  b、在const与非const函数的声明中造成了代码的高度重复

  c、const_cast<type>(xxx)能够去除xxx变量的const属性;static_cast<const type>(xxx)能够为xxx变量加上const属性

  d、必须使用非const函数中调用const函数的方式,因使用const中调用非const将破坏const函数的 bitwise constness

class TextBlock
{
public:
const char& operator[](std::size_t position) const
{
...
...
...
return text[position];
}
char& operator[](std::size_t position)
{
return const_cast<char&>( //将op[]返回值的const去除
static_cast<const TextBlock&>(*this) //为*this加上const
[position] //调用op[]
);
}
private:
std::string text;
}

注意:

1、如果函数得返回类型是个内置类型,那么改动函数得返回值从来就是不合法得

2、将某些东西声明为const,有利于编译器侦测出错误

3、编译器强制实施bitwise constness

effective c++ (一)的更多相关文章

  1. Effective前端2:优化html标签

    div { float: left; } .keyboard > div + div { margin-left: 8px; } --> div{display:table-cell;ve ...

  2. Effective java笔记(二),所有对象的通用方法

    Object类的所有非final方法(equals.hashCode.toString.clone.finalize)都要遵守通用约定(general contract),否则其它依赖于这些约定的类( ...

  3. 《Effective java》-----读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础.Spring研究.java并 ...

  4. 《Effective Java》学习笔记——积累和激励

    从一个实际案例说起 国庆长假前一个礼拜,老大给我分配了这么一个bug,就是打印出来的报表数量为整数的,有的带小数位,有的不带,毫无规律. 根据短短的两个多月的工作经验以及猜测,最终把范围缩小到以下这段 ...

  5. Effective前端5:减少前端代码耦合

    什么是代码耦合?代码耦合的表现是改了一点毛发而牵动了全身,或者是想要改点东西,需要在一堆代码里面找半天.由于前端需要组织js/css/html,耦合的问题可能会更加明显,下面按照耦合的情况分别说明: ...

  6. Effective前端4:尽可能地使用伪元素

    伪元素是一个好东西,但是很多人都没怎么用,因为他们觉得伪元素太诡异了.其实使用伪元素有很多好处,最大的好处是它可以简化页面的html标签,同时用起来也很方便,善于使用伪元素可以让你的页面更加地简洁优雅 ...

  7. Effective前端3:用CSS画一个三角形

    p { text-indent: 2em } .triangle-container p { text-indent: 0 } img { margin: 15px 0 } 三角形的场景很常见,打开一 ...

  8. Effective前端1:能使用html/css解决的问题就不要使用JS

    div{display:table-cell;vertical-align:middle}#crayon-theme-info .content *{float:left}#crayon-theme- ...

  9. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  10. effective java 读后感

    think in java  , effective java  这两本书一直都在java的生态圈中经久不衰.本来想着先翻过 think in java 这本大山,但是读到一半就放弃了.过长的篇幅,让 ...

随机推荐

  1. Linux技巧:一次删除一百万个文件最快方法

    昨天,我看到一个非常有趣的删除一个目录下的海量文件的方法.这个方法来自http://www.quora.com/How-can-someone-rapidly-delete-400-000-files ...

  2. 剑指offer-第三章高质量的代码(输出该链表中倒数第K个节点)

    题目:输入一个链表,输出这个链表中倒数第K个节点.(代码的鲁棒性) 思路:用两个指针p1和p2,都指向头节点,开始的时候,p2不动,p1移动k-1次,指向第k个节点.此时,如果p1->next! ...

  3. 史上最完整的Android开发工具集合

    路径: http://www.apkbus.com/thread-252748-1-1.html

  4. CSS打造三级下拉菜单

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...

  5. HashBiMap

    HashBiMap  AbstractMap类实现了Map接口定义的一些方法,而BiMap类定义了其子类需要实现的一些方法,使得所有实现BiMap的类必须符合其独有的特性:键.值都是唯一的.HashB ...

  6. 分享我的PL/SQL的优化设置,为开发全面提速

    打开[工具]–[首选项]: 1.登陆历史:勾选[存储历史]和[带口令存储],方便下次登陆,免去每次都输入密码的烦恼: 2.编辑器: a.勾选[语法高亮]允许: b.关键词大小写选择大写: c.配置自动 ...

  7. cdh5.4、cm5.4 安装详细步骤

    安装准备: 1.centos6.5 64位 虚拟机,内存分配4G.硬盘位20G 2.cm5.4 cdh5.4 包 安装步骤 一.centos安装完后,进行系统配置 1.关闭防火墙 service ip ...

  8. 数往知来SQL SERVER 视图 触发器 <九>

    SQL server学习_视图 1.视图 视图其实是一张虚拟表,他是一张表的部分数据或多张表的综合数据(视图就是把SQL语句封装起来) 可以看做是一个结果集,但是不是一个结果集 视图不具备存储数据的能 ...

  9. C#获取文件的绝对路径

    要在c#中获取路径有好多方法,一般常用的有以下五种: //获取应用程序的当前工作目录. String path1 = System.IO.Directory.GetCurrentDirectory() ...

  10. 第二百三十三天 how can I 坚持

    刚才看了场球,亚冠恒大和迪拜阿尔阿赫利,1:0,刚打开电脑就看到了进球,还是很幸运的. 在家待了一天,阴天,预报明天又中到大雪 啊,下吧.好希望下场大雪啊. 最近一直感觉好累,写代码不容易啊 ,还是因 ...