Effective C++ 读书笔记
文章平均质量分 63
读书笔记
温酒煮青梅
初级打工人
展开
-
【Effective C++ 条款41-45 笔记】【template隐式接口和编译期多态】【typename的双重意义】【处理模板化基类中的名称】【使用成员函数模板接受所有兼容类型】
条款41:template的隐式接口和编译期多态对于class来说是:显式接口、运行期多态显式接口:由函数签名式(函数名称、参数类型、返回值类型)组成运行期多态:根据运行期对象的实际类型决定调用哪个函数对于template来说就是:隐式接口、编译期多态隐式接口:不基于函数签名式,而是由有效表达式组成编译期多态:以不同的template参数具现化函数模板会导致调用不一样的函数编译期多态与运行期多态的区别,类似于:”哪一个重载函数该被调用(发生在编译期)“和”哪一个virtual函原创 2021-11-24 15:42:42 · 718 阅读 · 0 评论 -
【Effective C++ 条款34-40 笔记】【区分接口继承和实现继承】【绝不重新定义继承而来的non-virtual函数和继承而来的缺省参数值】【明智使用private继承和多重继承】】
条款34:区分接口继承和实现继承public继承可分为两种:函数接口继承函数实现继承首先要明白纯虚函数:带有纯虚函数的类是抽象类,抽象类不能实例化对象,抽象类的子类必须重写该纯虚函数才能实例化对象,否则子类也将是个抽象类成员函数的接口总会被子类继承。声明一个纯虚函数是为了让子类只继承函数接口声明一个普通的虚函数,是为了让子类继承该函数的接口和缺省实现声明一个non-virtual函数,是为了让子类继承这一函数接口以及父类对该函数的实现条款36:绝不重新定义继承而来的non-virt原创 2021-11-23 16:18:22 · 282 阅读 · 0 评论 -
【Effective C++ 条款29-33 笔记】【为异常安全而努力】【透彻了解inline】【确定public继承塑造出is-a关系】【避免遮掩继承来的名称】
条款29:为异常安全而努力当异常被抛出时,具有异常安全的函数会:不泄露资源不丢失数据copy and swap(CAS):为打算修改的对象创建一份副本,在副本上进行一系列修改。在修改副本的过程中抛出任何异常,原对象不受影响。当所有的改变都成功后,将修改之后的副本和原对象在一个不抛出异常的操作中置换条款30:透彻了解inlineinline函数能够避免函数调用的开销,还能够让编译器对inline函数进行优化这是因为inline函数的机制是:在编译期以函数本体替换对inline函数的每一个调原创 2021-11-21 20:50:50 · 716 阅读 · 0 评论 -
【Effective C++ 条款24-28 笔记】【所有参数都需要类型转换,请采用non-member函数】【尽可能延后变量定义式的出现时间】【尽量少做转型动作】...
条款24:若所有参数都需要类型转换,请采用non-member函数比如一个重载乘号运算符的函数,如果operator*是member函数,那么该函数值接收一个形参,作为二元操作符,另一个参数就是对象自己如果operator*是一个non-member函数,那么必须在参数列表中必须写明两个形参比如自定义一个有理数类,在该类中我们重载operator*运算符,使该类的对象能够与普通的int变量进行计算class Rational {public: ... const Rational原创 2021-11-20 21:19:47 · 370 阅读 · 0 评论 -
【Effective C++ 条款20-23 笔记】【以传const引用替换传值】【必须返回对象时,别妄想返回其reference】【将成员变量声明为private】
条款20:以pass-by-reference-to-const替换pass-by-value意思是:参数传递最好用传const引用代替普通的传值为什么呢?传引用可以直接将实参本体传递进函数,而不用调用各种构造函数以及析构函数(完成副本的创建及销毁);注意:效率的提高并不只是减少了一次副本对象的拷贝构造以及析构,副本内可能含有多个同样需要拷贝构造的对象也需要创建并销毁传const引用可以告诉函数,以只读的形式对待实参在形参是父类对象,实参是子类对象的时候,传值的方式会直接将实参进行对象切割,构造原创 2021-11-19 21:35:26 · 653 阅读 · 0 评论 -
【Effective C++ 条款13-17 笔记】【以对象管理资源】【在资源管理类中小心copying行为】【在资源管理类中提供对原始资源的访问】【成对使用mew和delete时要采取相同形式】..
条款13:以对象管理资源动态分配对象时,对象存储在heap上,若不及时或者忘了delete对象指针,会造成内存泄露即便最后没有忘记delete对象指针,在函数运行到delete语句之前,可能会遇到以下状况使得delete语句不被执行:new和delete之间有一个过早的returnnew和delete位于某个循环内,该循环由于某个continue、break或者goto过早退出delete语句之前抛出异常,直接跳转到异常处理函数为了防止资源泄露,主要有两点要注意:获得资源后立即放进资源的原创 2021-11-18 20:36:35 · 308 阅读 · 0 评论 -
【Effective C++ 条款08-12 笔记】【别让异常逃离析构函数】【不在构造和析构过程中调用virtual函数】【令operator=返回一个绑定到*this的引用】...
条款08:别让异常逃离析构函数C++并不禁止析构函数抛出异常,但是不建议这样做有两个异常存在的情况下,程序不是结束执行就是导致不明确的行为如果无法避免析构函数产生异常的可能性,有两种办法:1、若析构函数爬出异常,就调用abort结束程序A::~A() { try {a.func();} catch(...) { //记录调用a.func()过程中出现异常 abort(); }}2、吞下异常,当做什么也没发生过A::~A()原创 2021-11-17 21:06:24 · 410 阅读 · 0 评论 -
【Effective C++ 条款05-07 笔记】【C++默默编写并调用哪些函数】【禁止编译器自动生成函数】【什么时候基类要带虚析构函数】
条款05:了解C++默默编写并调用哪些函数一个空类,编译器会自动声明:默认构造函数(对于非空类:只在没有自定义任何构造函数的时候,才会由编译器补充)拷贝构造函数拷贝赋值运算符析构函数(非虚函数)注意:当一个class内含有reference/const成员时,编译器不提供拷贝赋值运算符的补充,只能由程序员自己编写这是因为C++不允许改变reference成员的指向,也不允许更改const成员条款06:若不想使用编译器自动生成的函数,就该明确拒绝问题:比如说想要禁止一个类对象的拷贝原创 2021-11-16 20:36:39 · 407 阅读 · 0 评论 -
【Effective C++ 条款03 笔记】尽可能使用const
条款03:尽可能使用const一、顶层const和底层const区分一下:int a = 1;const int* pa = a;//底层const,a的值不能变int b = 2;int* const pb = b;//顶层const,pb的值不能变,即不能更改pb的指向注意除了指针这种复合类型,其余基本类型的变量设置const全部为顶层const二、const作用于迭代器声明一个const迭代器与顶层指针类似:const vector<int>::iterator it原创 2021-11-12 20:37:47 · 590 阅读 · 0 评论 -
【Effective C++ 条款02 笔记】尽量以const,enum,inline替换#define
条款02:尽量以const,enum,inline替换#define部分来源:https://blog.csdn.net/weixin_37992828/article/details/81117036关于const在使用宏定义的时候,比如#define pi 3.14159宏pi根本没有进入记号表,当使用这个宏但是编译错误时,只会提示是3.14159出现了错误。如果这一行宏定义出现在不是程序员自己写的头文件时,也就查不到这个3.14159到底是出现在哪里了。因此,提倡使用常量来替换宏定义原创 2021-11-08 20:25:10 · 218 阅读 · 0 评论