effective C++ 笔记

20190228暂停学习,后续继续

第一部分让自己习惯C++

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

C++最初的名称C with Classes
C++是个多重范型编程语言,一个同时支持过程形式(procedural)、面向对象形式(object-oriented)、函数形式(functional)、泛型形式(genneric)、元编程形式(metaprogramming)的语言。
C++主要的次语言:C、Object-Oriented C++、Template C++、STL。

  • 区块(blocks)、语句(statements)、预处理(preprocessor)、内置数据类型(built-in data types)、数组(arrays)、指针(pointers)……
  • Object-Oriented C++。这部分是C with Classes所诉求的:class(包括构造函数和析构函数)、封装(encapsulation)、继承(inheritance)、多态(polymorphism)、virtual函数(动态绑定)……
  • Template C++是C++的泛型编程部分
  • STL是个template程序库,对容器(containers)、迭代器(iterators)、算法(algorithms)、以及函数对象(function objects)的规约有极佳的紧密配合与协调。

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

编译器替换预处理器,#define不被视为语言的一部分
以一个常量替换上述的宏(#define)
#define ASPECT_RATIO 1.653 ------> const double AspectRatio = 1.653;

class专属常量。为了将常量的作用域(scope)限制于class内,必须让它成为class的一个成员(member);为了确保此常量至多只有一份实体,必须让它成为一个static成员

template inline函数(内联函数)

有了consts、enums和inlines,我们对预处理器(特别是#define)的需求降低了,并非完全消除。#include仍然是必需品,而#ifdef/#ifndef也继续扮演控制编译的重要角色。目前还不到预处理器全面引退的时候。

请记住

  • 对于单纯常量,最好以const对象或enums替换#defines
  • 对于形似函数的宏(macros),最好改用inline函数替换#defines

条款3:尽可能使用const

指定语义约束,而编译器会强制实施这项约束。
const char* p=greeting; //non-const pointer,const data
char* const p=greeting; //const pointer,non-const data
const char* const p=greeting;//const pointer,const data
关键字const出现在星号左边,表示被指物是常量;出现在右边,表示指针自身是常量。
预防变量被重新赋值更改。
const成员函数
将const实施于成员函数的目的是为了确认该成员函数可作用于const对象身上。
第一,使class接口比较容易被理解。(可以得知哪个函数可以改动,哪个函数不可以被改动)
第二,使“操作const对象”成为可能。
请记住

  • 将某些东西声明为const可帮助编译器侦测出错误用法。
  • 编译器强制实施bitwise constness ,但你编写程序时,应该使用“概念上的常量性”(conceptual constness)
  • 当const和non-const成员函数有这实质等价的实现时,令non-const版本调用const版本可避免代码重复。
    相关blog:

https://www.cnblogs.com/jiabei521/p/3335676.html

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

请记住

  • 内置型对象进行手工初始化,因为C++不保证初始化它们
  • 构造函数最好使用成员初值列,而不要在构造函数本体内使用赋值操作。初值列的成员变量,其排列次序应该和它们在class中的声明次序相同
    情况“:当多个源码文件,每个内含至少一个non-local static对象,如果编译丹玉内的non-local static 对象的初始化话动作使用了另一编译单元内的某个non-local static对象,它所用到的这个对象可能尚未初始化,因为C++对“定义于不同编译单元内的non-local static对象”的初始化次序并无明确定义。
  • 为免除“跨编译单元之初始化次序”问题,以local static对象替换non-local static对象

第二部分 构造/析构/赋值运算

条款5:了解C++默默编写并调用哪些函数

请记住
编译器可以暗自为class创建default构造函数、copy构造函数、copy assignment操作符,以及析构函数


条款06:若不想使用编译器自动生成的函数,就该明确拒绝

所有编译器产出的函数都是public。为阻止这些函数被创建出来,你得自行声明它们,将copy构造函数或copy assignment操作符声明为private。
以上,明确声明一个成员函数,阻止了编译器暗自创建其专属版本;而令这些函数为private,使你得以成功阻止人们调用它。

请记住
为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现。使用Uncopyable这样的base class也是一种做法。


条款07:为多态基类声明virtual析构函数

条款08:别让异常逃离析构函数

条款09:绝不在构造和析构过程中调用virtual函数

条款10:令operator= 返回一个reference to *this

条款11:在operator=中处理“自我赋值”

条款12:复制对象时勿忘其每一个成分


第三部分 资源管理

条款13:以对象管理资源

条款14:在资源管理类中小心coping行为

条款15:在资源管理类中提供对原始资源的访问

条款16:成对使用new和delete时要采取相同形式

条款17:以独立语句将newed对象置入智能指针

第四部分 设计与声明

条款18:让接口容易被正确使用,不易被误用

条款19:设计class犹如设计type

条款20:宁以pass-by-reference-to-const替换pass-by-value

条款21:必须返回对象时,别妄想返回其reference

条款22:将成员变量声明为private

条款23:宁以non-member、non-friend替换member函数

条款24:若所有参数皆需类型转换,请为此采用non-member函数

条款25:考虑写出一个不抛异常的swap函数


第五部分 实现

条款26:尽可能延后变量定义式的出现时间

条款27:尽量少做转型动作

条款28:避免返回handles指向对象内部成分

条款29:为“异常安全”而努力是值得的

条款30:透彻了解inlining的里里外外

条款31:将文件间的编译依存关系降至最低


第六部分 继承与面向对象设计

条款32:确定你的public继承塑模出is-a关系

条款33:避免遮掩继承而来的名称

条款34:区分接口继承和实现继承

条款35:考虑virtual函数以为的其他选择

条款36:绝不重新定义继承而来的non-virtual函数

条款37:绝不重新定义继承而来的缺省参数值

条款38:通过复合塑模出has-a或“根据某物实现出来”

条款39:明智而审慎地使用private继承

条款40:明智而审慎地使用多重继承


第七部分 模板与泛型编程

条款41:了解隐式接口和编译期多态

条款42:了解typename的双重意义

条款43:学习处理模块化基类内的名称

条款44:将与参数无关的代码抽离templates

条款45:运用成员函数模板接受所有兼容类型

条款46:需要类型转换时请为模板定义非成员函数

条款47:请使用traits classes表现类型信息

条款48:认识template元编程


第八部分 定制new和delete

条款49:了解new-handler的行为

条款50:了解new和delete的合理替换时机

条款51:编写new和delete时需固守常规

条款52:写了placement new也要写placement delete

***杂项讨论

条款53:不要轻忽编译器的警告

条款54:让自己熟悉包括TR1在内的标准程序库

请记住
C++标准程序的主要机能是由STL、iostreams、locales组成,并包含C99标准程序库;
TR1添加了诸如智能指针、一般化函数指针、哈希容器、正则表达式及其他10个组件;
TR1只是一个规范,为了熟悉此规范你必须熟悉源码,Boost是个不错的源码库。

条款55:让自己熟悉Boost

boost程序库十个类目

字符串与文本处理
容器
函数对象和高级编程
泛型编程(覆盖一大组traits classes)
模板元编程(Template metaprogramming,TMP)
数学和数值
正确性与测试
数据结构
语言间的支持
内存
杂项(CRC检验、日期和时间处理、在文件系统上来回移动)

全部评论

相关推荐

点赞 评论 收藏
转发
投递腾讯云智研发等公司10个岗位
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务