美文网首页
Effective C++ 学习笔记

Effective C++ 学习笔记

作者: JeremyYv | 来源:发表于2019-11-23 17:55 被阅读0次

    第一章.让自己习惯C++


    • 条款2.尽量以const, enum, inline 替换 #define
      A.以 const 替换 #define:
      原因1. #define 在预处理阶段进行了替换,然后编译阶段不将替换前的名称写入符号表,编译错误信息中不会显示宏名称
      原因2. const 可以将变量的作用域限制在class内,#define定义的宏在包含了该头文件的文件里都可以使用
      原因3. const 有类型检查,define只是简单的字符替换
      B.以 enum 替换 #define:
      原因1. 旧式编译器不支持类的static成员在声明式上获得初值。
      但是如果在类的编译期间需要一个常量值(例如用于确定数组大小),可使用enum。
      而且enum不能被取址,与define很相像
      原因2. enum是模版元编程的基础技术,必须认识它。(虽然我还并不知道什么是模版元编程_
      C.以 inline 替换 #define
      原因1. 宏函数中有++判断会导致变量数值变化

    • 条款3.尽可能使用const
      A.将某些东西声明为const可使编译器帮助检测出错误用法。
      B.const用于成员函数:
      1.两个成员函数如果只是常量性不同,可以被重载
      2.改善C++程序效率的一个根本办法是传const引用,用const修饰函数可以使函数内无法改变外部取到的变量
      3.如果希望某个成员变量可以在const函数中被改变,在声明变量时使用mutable修饰它
      C.当const和non-const成员函数有着等价实现时,可以通过将non-const对象转型成const,调用const成员函数,在将返回值转型成non-const,反之不推荐

    • 条款4.确定对象被使用前已被初始化
      A. C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前,即初始化列表之中。在构造函数体内完成的是赋值。
      B. 如果成员变量是const或引用,他们就一定需要初值,不能被赋值,参考A。
      C. 成员变量按照声明次序初始化,与初始化列表中的顺序无关。
      D. C++无法确定不同编译单元(基本是一个源码文件+一个头文件)中non-local-static对象的初始化先后次序,
      如果两个static变量初始化有次序依赖,可能会导致使用未初始化的值
      所以使用static成员变量的最佳方式,是将该变量搬到自己的专属函数内(该变量在该函数中被声明为static),第一次调用的时候初始化该变量

    第二章.构造/析构/赋值运算


    • 条款5.了解C++默认编写并调用哪些函数
      A. 构造、拷贝构造、赋值、析构、取址符,const取址符(后两者书中没有提到)
      B. 内含引用或const成员的类,如果想支持赋值操作,必须自己定义赋值操作符函数,编译器不会提供默认赋值操作符

    • 条款6. 若不想使用编译器自动生成的函数,就该明确拒绝
      A. 所有编译器产出的默认函数都是public
      B. 将拷贝构造函数或拷贝赋值操作符声明为private,可以阻止编译器生成默认版本。只声明不定义,可以使调用者获得连接错误。

    • 条款7. 为多态基类声明virtual析构函数
      基类指针指向派生类对象,析构时应调用派生类的析构函数

    • 条款8. 别让异常逃离析构函数
    • 条款9. 绝不在构造和析构过程中调用virtual函数

    相关文章

      网友评论

          本文标题:Effective C++ 学习笔记

          本文链接:https://www.haomeiwen.com/subject/vyabictx.html