自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 《Effective C++读书笔记》--条款29:努力写出异常安全的代码

异常安全有两个条件:①不泄漏任何资源②不允许数据破坏对于资源泄漏的问题我们只要遵循以对象管理资源这条条款就很容易解决,对于数据败坏的问题,首先我们要知道异常安全函数的概念,异常安全函数提供以下三个保证之一:①基本承诺:如果异常被抛出,程序内所有事物仍保持在有效状态下,没有任何对象或数据结构被破坏,所有对象都处于一种内部前后一致的状态。②强烈保证:如果异常被抛出,程序状态不改变。

2017-08-31 22:36:18 459

原创 《Effective C++读书笔记》--条款13:以对象管理资源

对于刚接触C++程序员来说,内存泄漏可能是最常遇到的会导致程序崩溃的问题。程序员自己管理内存和资源是一把双刃剑,用的好会使程序效率大大提高,用的不好便会造成一系列诸如内存泄漏,程序崩溃的致命问题。除了最常用的分配内存,还有许多需要管理的资源,包括文件描述器、数据库连接、互斥锁、图形界面中的画笔,网络socket等等。由于异常、函数体内的多个return(在释放资源前程序就退出),程序改动时没充分考

2017-08-30 10:34:45 291

原创 《Effective C++读书笔记》--条款08:别让异常逃离析构函数

在C++中不禁止析构函数抛出异常,但这是不推荐的行为,比如一个vector v,当v被销毁时,其中的所有widget都会被销毁,也就会调用它们的析构函数,但如果在析构函数中抛出异常,则会同时出现多个同时作用的异常(每销毁一个widget抛出一个异常),则会导致程序UB。对于这种情况,有一种方法就是在析构函数中处理该异常,但这并不是一个好方法。对此我们可以重新设置一个接口,将处理异常的责任从析构函数

2017-08-29 11:23:08 321

原创 《Effective C++读书笔记》--条款07:为多态基类声明virtual析构函数

在某些情况下,我们需要将析构函数声明为virtual,典型的一个例子就是当父类的指针指向子类对象时,删除该指针只会调用父类的析构函数而没调用子类的析构函数,也就是局部销毁,此时会造成内存泄漏。这时我们则需要将父类的析构函数声明为virtual.任何类只要带有虚函数就几乎可以确定应该有一个虚析构函数,因为有虚函数代表有些功能会被子类所重写来实现多态。所以当我们继承没有虚析构函数的类时需要格外注意。

2017-08-28 16:32:35 262

原创 《Effective C++读书笔记》--条款06:若不想使用编译器自动生成的函数,就应该明确拒绝

首先我们要明确,编译器产出的所有函数都是public,因此将成员函数声明为private且故意不去实现他们可以阻止编译器为你自动生成你不想要的函数。但我们在member函数或friend函数中使用该函数时,那么会在连接时发生错误,我们可以将错误迁移至编译阶段,此时的方法就是专门设计一个阻止拷贝动作的基类,这个基类的实现如下:class Uncopyable{protected: Un

2017-08-28 13:56:08 285

原创 《Effective C++读书笔记》--条款05:了解C++默默编写并调用哪些函数

编译器会默认为每个类声明一个默认构造函数,拷贝构造函数,赋值操作符和一个析构函数(如果你自己不声明),而这些函数都是public且inline的,当这些函数被调用时才会被编译器创建出来。此时我们要注意,编译器产出的析构函数是一个非虚函数,除非这个类的基类声明有虚析构函数,虚析构函数的作用我们将在下两章提到。

2017-08-28 13:32:47 287

原创 《Effective C++读书笔记》--条款04:确定对象被使用前已先被初始化

对于C++来说,定义一个值未初始化,其值是一个不确定的数,而当我们使用未初始化的值会导致UB,在不同的平台上表现不一样,总之会给程序带来不可预知的行为,我们要尽力避免。所以对于内置类型来说,我们要尽量在使用对象之前将他初始化,至于内置成员之外的类型,初始化的任务落在构造函数上,我们要确保每个构造函数将每个对象的每一个成员都初始化。此时有两种方法,一是在初始化列表中初始化,二是在构造函数中赋值。对此

2017-08-26 10:16:55 312

原创 《Effective C++读书笔记》--条款03:尽可能使用const

--1、const修饰指针和对象的不同方法:对于const时代表指针指向的地址是const还是该指针指向的地址内的对象是const,只需牢记一点:如果关键字const出现在*左边,表示被指物是常量,如果出现在*右边,表示指针本身是常量。在STL中来说,声明迭代器为const就如同声明指针为const一样(const在*左边),表示迭代器不得指向不同的东西,但它所指向的东西的值可以改变。如果

2017-08-22 18:14:40 314

原创 《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 264

原创 关于初始化列表的总结

使用初始化列表主要有两个方面的原因:一是某些情况下不得不使用初始化列表,二是基于效率方面的考虑,一下我们具体分析这两种情况:一:必须使用初始化列表:初始化列表是在构造函数之前执行的,当我们的成员变量中具有常量值,引用或者没有无参构造函数的类时,我们必须使用初始化列表初始化。因为常量值只能被定义一次,且不能给常量赋值,对于类成员变量来说,由于编译器会在调用构造函数之前初始化该类,此时会调用该

2017-08-17 17:03:04 329

转载 什么情况下必须使用C++的初始化列表

先给理论。 1. 初始化 != 赋值. a.初始化代表为变量分配内存. 变量在其定义处被编译器初始化(编译时). 在函数中, 函数参数初始化发生在函数调用时(运行时). b.赋值代表"擦除对象当前值, 赋予新值". 它不承担为对象分配内存的义务. 2. C++中, 类成员的初始化于初始化列表中完成, 先于构造函数体执行. 即成员真正的初始化发生在初始化列表中, 而不是构造函数体中.再给说明。

2017-08-17 09:37:05 1823

原创 python中的类属性与实例属性

python中的类属性类似于C++中用static修饰的属性,是类所有的,被类的所有实例共享,而实例属性是每个类独有的,但与C++不同的是python的查找机制,如果实例有了该类属性,则不会继续查找类属性,引用一段话来解释:Python中属性查找机制Python中属性的获取存在一个向上查找机制,还是拿上面的例子做说明:Python中一切皆对象,AAA属于类对象,obj1

2017-08-03 18:54:07 474

原创 Qtmsvc2010+Opencv2.4.9配置

本人看了网上许多教程,终于成功配置了opencv库,现将配置过程的经验分享出来,也给自己做个记录。本人在配置时因为目录问题出现了很多问题,所以我最后将opencv目录放在D盘根目录下,并把openCV/bulid/x86/vc10/bin加入到环境变量中,在pro文件中添加包含目录及静态库,pro文件如下INCLUDEPATH+=d:/opencv/build/include/op

2017-08-02 14:55:36 577

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除