Effective C++ 读书笔记
灯火阑处
爱生活,爱编程,酷爱计算机,将来要在IT行业大干一番
展开
-
Effective C++ 条款26 尽可能延后变量定义式的出现时间
1. 如果变量定义得过早,那么如果在变量定义后被用到之前出现异常,变量未被用到,但仍然要承担构造和析构成本,此外变量用时再定义也便于查找变量,增加代码可读性.2. 对于循环,除非赋值成本比构造和析构成本低且程序对效率高度敏感,将变量定义放在循环内部可以限制变量作用域,增强程序的可理解性和易维护性.//// main.cpp// 条款26:尽可能延后变量定义式的出现时间////...原创 2018-07-31 23:33:11 · 155 阅读 · 0 评论 -
Effective C++ 条款24 若所有参数皆需类型转换,请为此采用non-member函数
1. 通常,将只接受拷贝构造函数声明为explict是一个不错的主意,因为这可以避免自动的隐式类型转换所带来的错误,但有些情况下,使类支持隐式类型转换是可行的,例如自定义的数值类型:class Rational { public: Rational(int a = 0, int b = 1) : _numerator(a), _denominator(b),_result(a/b...原创 2018-07-31 23:31:20 · 201 阅读 · 0 评论 -
Effective C++ 条款14 在资源管理类中小心copying行为
1. 条款13中讲到“资源取得的时机便是初始化时机”并由此引出“以对象管理资源”的概念,资源会在不需要的时刻被销毁。通常情况下使用std中的auto_prt(智能指针)和tr1::shared_ptr(引数智能指针)作为资源管理的对象,这种做法通常都十分有效。但是,auto_ptr和shared_ptr只能管理基于堆(heap-based)的资源,而非heap-base的资源往往不合适。因此有必要...原创 2018-09-12 13:35:17 · 168 阅读 · 0 评论 -
Effective C++ 条款13 以对象管理资源
//// main.cpp// 条款13:以对象管理资源//// Created by 于磊 on 2018/7/8.// Copyright © 2018 于磊. All rights reserved.//#include <iostream>class Investment {public: ~Investment(){ st...原创 2018-09-11 23:28:17 · 143 阅读 · 0 评论 -
Effective C++ 条款12 复制对象时勿忘其每一个部分
1. 编译器合成的拷贝构造函数默认调用基类的拷贝构造函数,合成的拷贝构造操作符也是一样.2. 对于自己编写的拷贝构造函数,编译器不再默认调用基类的拷贝构造函数,仅在拷贝构造函数中没有初始化基类部分时调用默认构造函数.对于自己编写的拷贝赋值操作符,编译器不额外作任何操作(即使类的编写者忘记调用基类的拷贝赋值操作符)!3. 此外,在为类添加新的数据成员时,如果拷贝构造函数和赋值操作符是自己编写...原创 2018-09-11 21:42:26 · 127 阅读 · 0 评论 -
Effective C++ 条款09 决不在构造和析构过程后调用虚函数
1.C++的继承体系中,最底层的派生类的构造过程中,最先初始化的是基类部分,再按继承层次依次初始化派生类部分,同样的,析构过程则是按相反过程执行。在继承层次A→B→C→D中,构造一个D类对象,其依次经历了A→B→C→D的转变,因此对于以下代码。所以,在这个过程中基类构造过程中,基类尚在构造,派生类对象中也就只存在继承而来的基类部分,调用虚函数这类的调用从不下降至derived class//...原创 2018-08-24 13:38:31 · 145 阅读 · 0 评论 -
Effective C++ 条款08 别让异常逃离析构函数
1. 当异常发生时,如果异常发生在一个try块内部,程序就会跳出该try块,并逐层寻找匹配的catch,跳出try块的过程中,会销毁该try内创建的对象并调用析构函数,如果调用析构函数的过程中又发生异常,程序就会调用标准库terminate函数(terminate函数调用abort函数)结束执行,例如:class A{public: ... void func(){ ...原创 2018-07-31 23:20:38 · 177 阅读 · 0 评论 -
Effective C++ 条款07 为多态基类声明virtual析构函数
1. 如果一个类将要作为基类,那么它应该具有一个虚析构函数以防止delete经由基类指针指向的派生类对象时发生的"局部销毁"问题,避免造成内存泄露,数据结构败坏,在调试器上浪费时间等问题;任何带有虚函数的类几乎肯定需要一个虚析构函数.2. 在不必需的情况下不应该将成员函数设为虚函数,否则,如果导致一个本来没有虚函数的类带有虚函数,那么它就会增加一个隐含的vptr(virtual table p...原创 2018-07-31 23:13:56 · 134 阅读 · 0 评论 -
Effective C++ 条款06:若不想使用编译器自动生成的函数,就该明确拒绝
1. 某些类的含义决定了它们不具备某些功能,也就是说某些函数不能被创造出来以防被错误的使用(例如定义一个Book类,它含有一个表示ISBN的变量,这种情况下拷贝构造函数以及赋值操作符显然是没有意义的,因为任何两种书的ISBN都不同),但是编译器在类的创建者没有声明默认构造函数,拷贝构造函数,赋值操作符和析构函数的情况下会产生这些函数,为了避免这种情况,可以将这些函数声明为private并且不提供它...原创 2018-08-23 12:39:18 · 153 阅读 · 0 评论 -
Effective C++ 条款05:了解C++默默编写并调用哪些函数
1. 成员函数只有被需要(被调用)才必须有定义,同理,只有当默认构造函数,拷贝构造函数,赋值操作符,析构函数被需要而类定义它们时,它们才会被编译器创建出来(除非函数在基类中被声明为虚函数,编译器产生的函数是非虚的,public的).2. 并不是只要类没有定义默认构造函数,拷贝构造函数,赋值操作符时编译器就会自动合成它们,它们只有在"被需要"的时候才被产生.3. 虽然编译器在类的创建者没有声...原创 2018-07-31 23:09:58 · 127 阅读 · 0 评论 -
Effective C++ 条款04 确定对象被使用前已被初始化
条款4 确定对象被使用前已被初始化 1. 对于内置类型,如果变量在全局作用域内定义,默认初始化为0,如果变量在局部作用域内定义,默认不进行初始化;对于类类型,默认调用默认构造函数进行初始化,如果没有默认构造函数,则必须显式初始化. 2. 构造函数对成员进行初始化的动作发生在初始化列表中而不是函数体内,在函数体内进行的"初始化"实际上是赋值,对于类类型,降低了程序效率,对于内置类...原创 2018-07-07 23:02:55 · 215 阅读 · 0 评论 -
Effective C++ 条款03 尽可能使用const
条款3 尽可能使用const1. const 可被施加于任何作用域内的对象,函数参数,函数返回类型,成员函数本体;用const修饰指针,可指出指针自身、指针所指物或两者都(或都不)是const。如果const出现在*之前,表明指针不能更改所指向的对象的内容,如果const出现在*之后,表明指针只能指向同一块内存。另外int const*p和const int*p含义相同。如果对象成员有普通指针...原创 2018-07-07 19:40:33 · 321 阅读 · 0 评论 -
Effective C++ 条款02 尽量以const,enum,inline替换#define
条款2 尽量以const,enum,inline替换#define“宁可以编译器替换预处理器”,因为#define不被视为语言的一部分。这也是问题所在: #define ASPECT_TATIO 1.653 记号名称ASPECT_TATIO也许从未被编译器看见:也许在编译器开始处理源码之前它就被预处理器移走了。于是记号名称ASPECT_TATIO有可能没进入...原创 2018-07-07 15:32:18 · 221 阅读 · 0 评论 -
Effective C++ 条款01 视C++为一个语言联邦
让自己习惯 C++1. 一开始,C++只是C加上一些面向对象特性,最初名称为"C with Classes"(带类的C).2.如今的C++已经是一个多重范型编程语言,同时支持过程形式(procedural),面向对象形式(object-oriented),函数形式(functional),泛型形式(generic),元编程形式(metaprogramming)的语言。这些能力和弹性可...原创 2018-07-07 13:49:39 · 224 阅读 · 0 评论