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

可以将C++分为4个层次:

  • 1、C:C++实在C语言的基础上发展而来的。
  • 2:Object-Oriented C++:C++面向对象。
  • 3:Template C++:C++中的泛型编程。
  • 4:STL:这是一个标准模板库。

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

  • const的好处:

    • define直接预编译时常量替换,出现编译错误不易定位(不知道常量是哪个变量)
    • define没有作用域,const有作用域提供了封装性
  • enum的好处:
    • 提供了封装性
    • 编译器肯定不会分配额外内存空间(其实const也不会)
  • inline的好处:
    • define宏函数容易造成误用(下面有个例子)
//define误用举例
#define MAX(a, b) a > b ? a : b
int a = 5, b = 0;
MAX(++a, b) //a++调用2次
MAX(++a, b+10) //a++调用一次

条款3:尽可能使用const

  • const定义接口,防止误用
  • const成员函数
    • 作用于const 对象
    • 不可以更改成员变量
    • 只能调用const成员函数(非const成员可以调用所有成员函数)

条款4:确定对象使用前已先被初始化

  • 内置类型需要定义时初始化
  • 使用初始化序列,而不是在构造函数中赋值
    • 构造函数中赋值会先调用default构造函数,再调用copy赋值操作符
    • 初始化序列只调用copy构造函数,效率更高
    • 最好使初始化序列顺序与声明顺序相同
  • static对象
    • 作用域为从构造开始到程序结束为止(非stack和heap-based 对象)
    • 包含global对象、定义于namespace作用域内对象、在class内、在函数内、以及在file作用域内被声明为static的对象
    • 函数内的static对象被称为local static对象,其他static对象被称为non-local static 对象
    • 不同编译单元内的non-local static对象的初始化次序无明确定义
  • 将static对象放入一个专属函数中(将non-local static对象替换为local static对象)
    • 函数内的local static对象会在“函数被调用期间”“首次遇上该对象的定义”时被初始化
    • 函数未被调用不会触发该对象的构造函数
Base& instance(){
static Base b;
return b;
}

《Effective C++》让自己习惯C++:条款1-条款4的更多相关文章

  1. Effective C++:条款27——条款

    条款27:尽量少做转型动作 单一对象可能拥有一个以上的地址!

  2. 《MORE EFFECTIVE C++》条款20 条款21

    条款20 协助编译器实现返回值优化 当重载运算符的时候,比如+ - * / 这类运算符,该函数返回的值一定是个右值(即不能是引用),那么执行一次运算的开销可能会在临时对象上调用多次构造函数和析构函数, ...

  3. Effective C++ ——让自己习惯C++

    条款一:视C++为一个语言联邦 为了理解C++,你必须认识其主要的次语言.幸运的是总共只有四个: C:C++是由C语言继承而来的,必然对C有很好的兼容性,这一部分主要包括C中的一些语言,库函数等.但当 ...

  4. 《Effective C++》定制new和delete:条款49-条款52

    条款49:了解new-handler的行为 当operator new无法分配出内存会抛出异常std::bad_alloc 抛出异常前会反复调用用户自定义的new-handler函数直至成功分配内存 ...

  5. Effective C++ —— 让自己习惯C++(一)

    条款01 : 视C++为一个语言联邦 C++ == C(C基本语法) + Object-Oriented C++(类,封装,继承,多态……) + Template C++(泛型编程) + STL(容器 ...

  6. Effective Modern C++ ——条款2 条款3 理解auto型别推导与理解decltype

    条款2.理解auto型别推导 对于auto的型别推导而言,其中大部分情况和模板型别推导是一模一样的.只有一种特例情况. 我们先针对auto和模板型别推导一致的情况进行讨论: //某变量采用auto来声 ...

  7. 《Effective C++ 》学习笔记——条款11

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  8. Effective Modern C++ 条款4:掌握查看型别推导结果的方法

    采用何种工具来查看型别推导结果,取决于你在软件开发过程的哪个阶段需要该信息.主要研究三个可能的阶段:撰写代码阶段.编译阶段.运行时阶段. IDE编译器 IDE中的代码编译器通常会在你将鼠标指针选停止某 ...

  9. Effective C++ —— 构造/析构/赋值运算(二)

    条款05 : 了解C++默默编写并调用哪些函数 编译器可以暗自为class创建default构造函数.copy构造函数.copy assignment操作符,以及析构函数. 1. default构造函 ...

  10. Effective C++学习记录

    Effective C++算是看完了,但是并没有完全理解,也做不到记住所有,在此记录下55个条款及条款末的"请记住". 让自己习惯C++ 条款01:视C++为一个语言联邦 ① C ...

随机推荐

  1. static 关键字和类的加载顺序

      静态变量在类加载时初始化,而非静态变量在创建对象时初始化.static关键字修饰的变量就是静态变量. 子类继承父类,子类在生成对象的时候,先初始化父类的成员变量,接着执行父类的构造器,完成父类的初 ...

  2. apache和nginx结合使用

    1  有时候我们希望将nginx和apache结合起来使用,nginx接受用户的请求,作为请求转发服务器,apache作为后端服务器. 2 配置如下 nginx 中将80端口的请求转发到8000端口上 ...

  3. 《JAVA程序设计》_第一周学习总结

    20175217吴一凡 <java程序设计> 第一周学习总结 虽然已经做好了心理准备,但第一周的学习任务着实让我忙了整整三天,还是挺充实的吧.寒假已经在自己的电脑上安装好了虚拟机,我就在我 ...

  4. 转://工作中 Oracle 常用数据字典集锦

    DBA工作中数据字典就等同于我们本和笔,时时刻刻也分不开的,不管是看状态,还是监控,都需要数据字典的支持,本文整理出来常用的数据字典系列,帮助大家来记住和汇总以便查询利用 ALL_CATALOG Al ...

  5. selenium中遇到div弹框,一起引申到其他弹框

    1.div弹框和DOM普通元素一样处理 2.出现一下就自动消失的弹框,也是在DOM中有描述的,可以使用xpath,用其内容定位 3.(转,其他弹框处理,包括alert和不同windows) https ...

  6. mysql 数据库磁盘占用量统计

    查看某个表的磁盘占用量 select (data_length+index_length)/1024/1024 M from information_schema.tables where table ...

  7. Tomcat的九个内置对象

    在之前学习过程中使用的对象大部分都是我们自己使用new关键字或者反射创建的,现在容器中会自动创建对象,我们只要直接使用即可,不需要我们再去创建这些对象,在Tomcat容器中提供了九种内置对象,有一些不 ...

  8. Generative Adversarial Nets[LSGAN]

    0 背景 在这之前大家在训练GAN的时候,使用的loss函数都是sigmoid_cross_entropy_loss函数,然而xudon mao等人发现当使用伪造样本去更新生成器(且此时伪造样本也被判 ...

  9. Spring_AOP 记录系统关键操作日志用法

    问题: 系统需要记录用户的关键操作日志,以便后期的系统维护,方便的查看问题,及时排除 分析: (1)保存字段:作为一个日志记录功能,首先数据库新建一张表保存用户的操作关键字段, 用户名,ip,操作描述 ...

  10. 晓晨高效IP提取工具 附源码

    在网上找的几个代理ip网站,抓取下来的.解析网页用的是HtmlAgilityPack,没有用正则.自己重写了ListView使他动态加载的时候不闪烁.效果图 下载地址:http://files.cnb ...