
Effective C++读书笔记
wingWC
Qt/OpenCV/AI
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
《Effective C++读书笔记》--条款02尽量以const,enum,inline替换#define
使用宏定义是一个不被推荐的做法,在阅读了书籍并且结合自身所读过的博客,总结以下两点不推荐使用宏定义的理由。--1、宏定义是简单的字符串替换:由于宏定义只是进行简单的字符串替换,因此有可能会造成意想不到的情况。典型的一个例子就是#define x+x 2x,当我们使用2x*2x时,我们的意图是得到(x+x)*(x+x),即4x,但实际上由于字符串替换 2x*2x相当于x+x*x+x=x+x^原创 2017-08-22 17:13:04 · 302 阅读 · 0 评论 -
《Effective C++读书笔记》--条款29:努力写出异常安全的代码
异常安全有两个条件:①不泄漏任何资源②不允许数据破坏对于资源泄漏的问题我们只要遵循以对象管理资源这条条款就很容易解决,对于数据败坏的问题,首先我们要知道异常安全函数的概念,异常安全函数提供以下三个保证之一:①基本承诺:如果异常被抛出,程序内所有事物仍保持在有效状态下,没有任何对象或数据结构被破坏,所有对象都处于一种内部前后一致的状态。②强烈保证:如果异常被抛出,程序状态不改变。原创 2017-08-31 22:36:18 · 509 阅读 · 0 评论 -
《Effective C++读书笔记》--条款13:以对象管理资源
对于刚接触C++程序员来说,内存泄漏可能是最常遇到的会导致程序崩溃的问题。程序员自己管理内存和资源是一把双刃剑,用的好会使程序效率大大提高,用的不好便会造成一系列诸如内存泄漏,程序崩溃的致命问题。除了最常用的分配内存,还有许多需要管理的资源,包括文件描述器、数据库连接、互斥锁、图形界面中的画笔,网络socket等等。由于异常、函数体内的多个return(在释放资源前程序就退出),程序改动时没充分考原创 2017-08-30 10:34:45 · 337 阅读 · 0 评论 -
《Effective C++读书笔记》--条款03:尽可能使用const
--1、const修饰指针和对象的不同方法:对于const时代表指针指向的地址是const还是该指针指向的地址内的对象是const,只需牢记一点:如果关键字const出现在*左边,表示被指物是常量,如果出现在*右边,表示指针本身是常量。在STL中来说,声明迭代器为const就如同声明指针为const一样(const在*左边),表示迭代器不得指向不同的东西,但它所指向的东西的值可以改变。如果原创 2017-08-22 18:14:40 · 360 阅读 · 0 评论 -
《Effective C++读书笔记》--条款08:别让异常逃离析构函数
在C++中不禁止析构函数抛出异常,但这是不推荐的行为,比如一个vector v,当v被销毁时,其中的所有widget都会被销毁,也就会调用它们的析构函数,但如果在析构函数中抛出异常,则会同时出现多个同时作用的异常(每销毁一个widget抛出一个异常),则会导致程序UB。对于这种情况,有一种方法就是在析构函数中处理该异常,但这并不是一个好方法。对此我们可以重新设置一个接口,将处理异常的责任从析构函数原创 2017-08-29 11:23:08 · 379 阅读 · 0 评论 -
《Effective C++读书笔记》--条款07:为多态基类声明virtual析构函数
在某些情况下,我们需要将析构函数声明为virtual,典型的一个例子就是当父类的指针指向子类对象时,删除该指针只会调用父类的析构函数而没调用子类的析构函数,也就是局部销毁,此时会造成内存泄漏。这时我们则需要将父类的析构函数声明为virtual.任何类只要带有虚函数就几乎可以确定应该有一个虚析构函数,因为有虚函数代表有些功能会被子类所重写来实现多态。所以当我们继承没有虚析构函数的类时需要格外注意。原创 2017-08-28 16:32:35 · 307 阅读 · 0 评论 -
《Effective C++读书笔记》--条款06:若不想使用编译器自动生成的函数,就应该明确拒绝
首先我们要明确,编译器产出的所有函数都是public,因此将成员函数声明为private且故意不去实现他们可以阻止编译器为你自动生成你不想要的函数。但我们在member函数或friend函数中使用该函数时,那么会在连接时发生错误,我们可以将错误迁移至编译阶段,此时的方法就是专门设计一个阻止拷贝动作的基类,这个基类的实现如下:class Uncopyable{protected: Un原创 2017-08-28 13:56:08 · 325 阅读 · 0 评论 -
《Effective C++读书笔记》--条款05:了解C++默默编写并调用哪些函数
编译器会默认为每个类声明一个默认构造函数,拷贝构造函数,赋值操作符和一个析构函数(如果你自己不声明),而这些函数都是public且inline的,当这些函数被调用时才会被编译器创建出来。此时我们要注意,编译器产出的析构函数是一个非虚函数,除非这个类的基类声明有虚析构函数,虚析构函数的作用我们将在下两章提到。原创 2017-08-28 13:32:47 · 330 阅读 · 0 评论 -
《Effective C++读书笔记》--条款04:确定对象被使用前已先被初始化
对于C++来说,定义一个值未初始化,其值是一个不确定的数,而当我们使用未初始化的值会导致UB,在不同的平台上表现不一样,总之会给程序带来不可预知的行为,我们要尽力避免。所以对于内置类型来说,我们要尽量在使用对象之前将他初始化,至于内置成员之外的类型,初始化的任务落在构造函数上,我们要确保每个构造函数将每个对象的每一个成员都初始化。此时有两种方法,一是在初始化列表中初始化,二是在构造函数中赋值。对此原创 2017-08-26 10:16:55 · 358 阅读 · 0 评论 -
《Effective C++读书笔记》--条款34:区分接口继承和实现继承
当我们设计一个类的时候,我们会希望其子类只继承成员函数的接口,但有时候又希望其继承接口和实现,但又希望能重写他们所继承的接口和实现或者不允许重写任何东西。我们首先要明确public继承含义,即is-A的关系,对于基类成立的所有条件,对其public继承的子类一定成立,反之则不然。当我们希望子类继承该函数的接口时,我们可将该函数在基类中定义为纯虚函数,此时基类是不可被实例化的,其中代表的含义是“原创 2017-09-11 14:46:06 · 329 阅读 · 0 评论