(将每一条item的总结和自己的理解给记录下来,以后有需要的话可以再回头参阅这些资料,不懂的再翻书温故。)

Item 02:尽量以const ,enum,inline替换#define

#define compare(x,y) func((x)>(y)?(x):(y));

//下面调用它
int a=5,b=0;
ccompare(++a,b);//a被累加两次
compare(++a,b+10);//a被累加1次
//像这种情况用define可能会出现难以捕捉的错误,而且要写很多的括号,不然可能会出现因为符号优先级的问题带来的bug

总结:

1.对于单纯的常量,尽可能用const来代替#define。

2.对于类似于函数的宏定义,可以使用inline函数来代替。


Item 03:尽可能使用const

令函数的返回值为const可以使得下面的错误避免发生

testClass a,b,c;
if(a*b=c)//如果a,b,c的operator=操作符返回值为const的,这里编译器会报错,不然找这个=号错误又要花费一段时间

关于const成员函数:

const成员函数绝对不能调用non-const成员函数,这样编译器会报错,如果要让这样的代码通过编译,要通过const_cast来将*this指针上的const属性解放。

结论:

1.将某些东西声明为const可以帮助编译器侦测出错误的用法。const可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。

2.编译器强制实施bitwise constness,但你编写程序时应该使用“概念上的常量性”(conceptual constness)

3.当const和non-const成员函数有着实质的等价时候,令non-const函数调用const函数可避免代码重复(绝对不能反过来!)


Item 04:确定对象在被调用前已经被初始化了

编译单元(translation unit)是指产出单一目标文件(single object file)的那些源码。基本上它是单一源码文件加上其所含的头文件(#include files)。

st由编译单元的定义可以引出一个问题,当两个源码文件中,每一个内含至少一个non-local static 对象(也就是说该对象是global的或者位于namespace作用域内,或者class内或者file作用域内被声明为static),这时候真正的问题就产生了:如果编译器内某个non-local static对象初始化的时候依赖于另一个对象的时候,它所用到的这个对象还没有被初始化,这时候怎么办?(C++对定义于不同编译单元内的non-local static 对象的初始化顺序是没有定义的)

我们可以采用Singleton模式:将每一个对象都搬到自己的专属函数内(该对象在此函数内被声明为static),这些函数返回一个reference指向它所含的对象。然后用户调用这些函数,而不直接触及到这些对象。换句话说,non-local static函数被local static对象替换了。

这个手法的基础在于:C++保证函数内的local static对象会在“函数第一次被调用的时候初始化它”,而且这样的好处在于,程序中从来没有使用到的static对象根本就不会初始化!这会带来效率上的提升!

总结:

1.为内置类型对象进行手动初始化,因为C++不会保证初始化它们。

2.构造函数最好使用成员初值列(member initialization list),而不要在构造函数本体内使用赋值构造(可以提高效率)。初值构造的成员顺序等同于在class中这些成员的声明次序,与在list中的顺序无关(这种情况下很容易写出让人意想不到的bug,在深入探索C++模型中也有提及到这一点!)

3.为了免除“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象。

《Effective C++》关于const,define等总结的更多相关文章

  1. const & define & inline

    0x01  const & define区别 宏定义#define发生在预编译期,而const,enum定义的常量发生在编译期,两者的重要差别在于编译期里的变量是进符号表的,而预编译期的宏是简 ...

  2. const define static extern

    const const意味着"只读",欲阻止一个变量被改变,可以使用const关键字 const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p) define #define ...

  3. C++ const && define

    本文记录了C++中的const关键字的内容,分为3个部分,const和define的区别,const的作用,const的使用. const和define的区别 const的作用 const用于定义常量 ...

  4. php const define 区别有那些呢?

    (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. (2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有 ...

  5. const define 定义常量的区别

    1.用const定义常量在编译的时候,提供了类型安全检查,而define 只是简单地进行字符串的替换 2.const定义的常量,会分配相应的内存空间.而define没有分配空间,只是在程序中与处理的时 ...

  6. PHP 中 const define 的区别

    在php中定义常量时,可用到const与define这两种方法,那他们到底有什么区别呢? 1.const用于类成员变量的定义,一经定义,不可修改.define不可用于类成员变量的定义,可用于全局常量. ...

  7. Const #define

    (1) 指针本身是常量不可变 (char*) const pContent;const (char*) pContent; (2) 指针所指向的内容是常量不可变 const (char) *pCont ...

  8. effective c++ prefer const,enum, inline to #defines

    学习心得 对于纯常量,最好以const对象或者enums替换#define #define FIRST 3 //not good enum { first=1, second=2 } ; int nu ...

  9. const define static extern 关键词详解

    const const关键词并不能把一个变量变成一个常量, 在符号前加上const表示这个符号不能被赋值, 即他的值对这个符号来说是只读的, 但并不代表这个值不能用其他方法去改变. 通过下面的例子就能 ...

  10. const define区别

    可以使用defined()----检测常量是否设置 [问]在php中定义常量时,const与define的区别? [答]使用const使得代码简单易读,const本身就是一个语言结构,而define是 ...

随机推荐

  1. 2.ElasticSearch系列之集群权限认证

    1. 在master节点上创建秘钥库 export ES_PATH_CONF="/home/elasticsearch/config" && /usr/local/ ...

  2. SpringBoot报错: No identifier specified for entity: XXX.XXX.XXX.XXX

    今天练习的时候报错说是 : 没有为实体指定标识符 仔细看了实体类才发现忘记写了一些注解 用JPA写实体类时一些注解是必须的 @entity  标名本类是实体类 @table(name="表名 ...

  3. gin领域层:用户实体编写和值对象(初步)

    1.用户实体和值对象 2. 要做的事 3.常见的四层模型 4.Domin层 5.值对象

  4. 【云原生 · Kubernetes】Kubernetes Node的隔离与恢复

    个人名片: 因为云计算成为了监控工程师‍ 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying Kubernetes Node的隔离与恢复 在硬件升级.硬件维护等情况下,我们需要将某些No ...

  5. ES文件传输助手1.0.0

    软件下载地址 1.软件功能 与 ES文件浏览器 的快传功能 直接传输文件 支持接受文件点击预览 可以多台电脑使用该软件,从而实现电脑与电脑局域网互传文件 单个文件夹上传会递归上传该文件夹下所有文件夹与 ...

  6. 关于deepin-wine或wine更换字体方法

    前言 首先要知道,deepin-wine打包的QQ和你自己用 deepin-wine跑的windows软件,他们所在不是同一个容器 deepin打包QQ所在的容器,在你的 ~/.deepinwine ...

  7. 30位以内随机产生时间戳加随机数id

    package com.zx.ps.web.gzdb; import java.text.SimpleDateFormat; import java.util.Date; public class c ...

  8. 【文档资料】Linux、Vi/Vim常用命令、文件夹和文件介绍

    一.Linux 1.系统信息[左1] 查看磁盘空间使用情况:df+参数 查看当前指定文件或目录的大小:du 查看不同硬件信息:cat/proc/xxx 查看系统和空闲内存:free +参数 SSH退出 ...

  9. 【JVM调优】Day01:Garbage的概念、垃圾回收的算法(标记清除、拷贝、标记压缩)、各种垃圾回收器(Serial、Parallel、CMS并发)及存在的问题

    〇.前言 简历写上:熟悉GC常用算法,熟悉常见垃圾回收器.具有实际JVM调优实战经验 瞬间涨3k 一.什么是garbage Java中垃圾回收器自动进行垃圾回收,不用自己回收 new 对象在内存中,c ...

  10. 10分钟看懂Docker和K8S,docker k8s 区别

    10分钟看懂Docker和K8S,docker k8s 区别 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫"dotCloud"的公司. 这家公司主要提供基于PaaS的 ...