(将每一条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. Docker | redis集群部署实战

    前面已经简单熟悉过redis的下载安装使用,今天接着部署redis集群(cluster),简单体会一下redis集群的高可用特性. 环境准备 Redis是C语言开发,安装Redis需要先将Redis的 ...

  2. Conda的使用

    conda常用的命令 在Anaconda Powershell Prompt 输入: 1.conda -V检验是否安装及当前conda的版本. 2.conda list查看安装了哪些包 3.conda ...

  3. 关于Object.keys()和Object.values()的使用

    关于Object.keys()和Object.values()的使用 1. 关于Object.keys() 1) 处理对象,返回可枚举的所有可枚举属性的字符串数组 let person ={ name ...

  4. 京东云开发者|IoT运维 - 如何部署一套高可用K8S集群

    环境 准备工作 配置ansible(deploy 主机执行) # ssh-keygen # for i in 192.168.3.{21..28}; do ssh-copy-id -i ~/.ssh/ ...

  5. C# 多线程访问之 SemaphoreSlim(信号量)【C# 进阶】

    SemaphoreSlim 是对可同时访问某一共享资源或资源池的线程数加以限制的 Semaphore 的轻量替代,也可在等待时间预计很短的情况下用于在单个进程内等待. 由于 SemaphoreSlim ...

  6. Excel中的VLOOKUP函数

    VLOOKUP函数是Excel中的一个纵向查找函数,功能是按列查找,最终返回该列所需查询序列所对应的值. 该函数的语法规则如下: VLOOKUP(lookup_value,table_array,co ...

  7. dp入门30题

    前言:本文章主要记录一些 \(dp\) 入门题,都是我做过的,希望读者能从这些基础题中打好 \(dp\) 扎实的基础,有不足的地方也欢迎指出.大部分是 \(CodeFoces\) 和 \(Atcode ...

  8. HTTPS详解一

    前言 作为一个有追求的程序员,了解行业发展趋势和扩充自己的计算机知识储备都是很有必要的,特别是一些计算机基础方面的内容,就比如本篇文章要讲的计算机网络方面的知识.本文将为大家详细梳理一下 HTTPS ...

  9. HDLBits答案——Verification: Writing Testbenches

    1 clock module top_module ( ); reg clk; dut U1(.clk(clk)); initial begin clk = 0; end always begin # ...

  10. 6. PyQt5 中的多线程的使用(上)

    专栏地址 ʅ(‾◡◝)ʃ 这一节引入了多线程这个非常重要概念, 在我认为多线程的重要性是紧紧次于信号与槽函数的, 因为在平时经常使用 1. 为什么要用多线程 先看下面这一个示例代码 6.1 from ...