互斥锁: 假设我们要在多线程中实现背景图片的控制: class PrettyMenu{ public: -- void changeBackground(std::istream& imgSrc);//改变背景图片 -- private: Mutex mutex; //互斥量 Image* bgImage; //当前背景图片 int imageChanges; //背景图片改变次数 }; void PrettyMenu::changeBackground(std::istream& img…
1.swap交换对象值,std提供了实现方法模版的实现,它的实现是交换对象值. namespace std { template<typename T> void swap(T& a,T& b) { T temp(a); a = b; b = a; } } 2.考虑下面的情况下,资源管理类Widget,内部只有一个指针WidgetImpl,该指针指向一个对象,这个对象中包含真正数据.对这种资源管理类执行swap,如果调用std中的swap,有哪些动作?对于Widget,copy…
引言 在我的上一篇博客中,讲述了swap函数. 原本swap只是STL的一部分,而后成为异常安全性编程的脊柱,以及用来处理自我赋值可能性. 一.swap函数 标准库的swap函数如下: namespace std { template<typename T> void swap(T &a, T& b) { T temp(a); a = b; b = temp; } } 只要类型T支持拷贝(通过拷贝构造函数和拷贝赋值操作符完成),那么这个版本的swap函数就会帮你置换类型为T的对…
记住: ★当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定其不抛出异常 ★若你提供一个member swap,也该提供一个non-member swap来调用前者.对于classes(而非templates),也请特化std::swap ★调用swap时应针对std::swap使用using声明式,然后调用swap并且不带任何“命名空间资格修饰” ★为“用户定义类型”进行std templates全特化是好的,但千万不要尝试在std内加入某些对std而言全新的东西 --…
(一) 缺省情况下swap动作可由标准程序库提供的swap算法完毕: namespace std { template<typename T> void swap(T& a, T& b) { T temp(a); a = b; b = temp; } } 这个函数是异常安全性编程的核心,而且是用来处理自我赋值可能性的一个常见机制 可是对某些类型而言,这些复制动作无一必要:当中基本的就是"以指针指向一个对象,内含真正数据"那种类型.多为"pimpl手…
Effective C++:参考自harttle land 类的swap实现与STL容器是一致的:提供swap成员函数, 并特化std::swap来调用那个成员函数. class Widget { public: void swap(Widget& other){ using std::swap; // 使得`std::swap`在该作用域内可见 swap(pImpl, other.pImpl); } }; namespace std { template<> void swap<…
当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常. 如果你提供一个member swap,也该提供一个non-member swap用来调用前者.对于class(而非templates),也请特化std::swap. 调用swap时应针对std::swap使用using声明式,然后调用swap并且不带任何“命名空间资格修饰”. 为“用户定义类型”进行std templates全特化是好的,但千万不要尝试在std内加入某些对std而言全新的东西.…
std::swap()是个很有用的函数,它可以用来交换两个变量的值,包括用户自定义的类型,只要类型支持copying操作,尤其是在STL中使用的很多,例如: int main(int argc, _TCHAR* argv[]) { ] = {,,,,,,,,,}; vector<); vector<, a + ); swap(vec1, vec2); ; i < vec1.size(); i++) { cout<<vec1[i]<<" "; }…
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常 演示样例: stl里的swap算法 namespace std{ template<typename T> void swap(T &a, T &b){ T temp(a); a = b; b = temp; } } //"pimpl手法"(pointe…
namespace AStuff{ template<typename T> class A { public: void swap(A *other) { using std::swap; swap(pImpl,other.plmpl); } private: AImpl *pImpl; }; template<typename T> void swap(A<T> &a,A<T>&b) { a.swap(b); } } template&l…
虚拟内存盘是通过软件将一部分内存(RAM)模拟为硬盘来使用的一种技术.相对于直接的硬盘文件访问来说,这种技术可以极大的提高在其上进行的文件访问的速度.但是RAM的易失性也意味着当关闭电源后这部分数据将会丢失.但是在一般情况下,传递到RAM盘上的数据都是在硬盘或别处永久贮存的文件的一个拷贝.经由适当的配置,可以实现当系统重启后重新建立虚拟盘.   中文名 虚拟内存盘 释    义 模拟硬盘 适应领域 计算机领域 特    点 极大的提高文件访问的速度 目录 1 原理和用途 2 实现及软件 原理和用…
每次安装Linux的时候,都会要求配置交换分区,那么这个分区是干嘛的呢?不设置这个分区有什么后果?如果一定要设置,设置多大比较合适?本篇将试图回答这些问题并尽量覆盖所有swap相关的知识. 下面的所有例子都在ubuntu-server-x86_64 16.04下执行通过 什么是swap? swap space是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合.简单点说,当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进…
原文写的非常好,来自这里 一个函数如果说是“异常安全”的,必须同时满足以下两个条件:1.不泄漏任何资源:2.不允许破坏数据. 我们先通过两个反面的例子开始. 第一个是造成资源泄漏的例子.一个类Type,内含一个互斥锁成员 Mutex mutex,以及一个成员函数void Func().假设Func函数的实现如下所示: 首先是获得互斥锁,中间是做该做的事,最后释放互斥锁.从功能上来讲很完整,没任何问题.但从异常安全角度来说,它却不满足条件.因为一旦DoSomething()函数内部导致异常,UnL…
item 25:一个不抛异常的swap函数 标准库有一个swap用于交换两个对象值 namespace std{ template<typename T> void swap(T& a , T& b) { T temp(a) ; a = b ; b = temp ; } } 所以,只要对象的类型T支持copying(copy ctor 和 copy assignment),那么你就可以用这个标准库的swap,但是,你必须保证,你swap的时候,上述操作是你需要的,有的时候,没有…
http://blog.csdn.net/bonchoix/article/details/8046727 一个函数如果说是“异常安全”的,必须同时满足以下两个条件:1.不泄漏任何资源:2.不允许破坏数据. 我们先通过两个反面的例子开始. 第一个是造成资源泄漏的例子.一个类Type,内含一个互斥锁成员 Mutex mutex,以及一个成员函数void Func().假设Func函数的实现如下所示: void Type::Func() { Lock(&mutex); DoSomething();…
下面的所有例子都在ubuntu-server-x86_64 16.04下执行通过 什么是swap? swap space是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合.简单点说,当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问swap上存储的内容时,再将swap上的数据加载到内存中,这就是我们常说的swap out和swap in. 为什么需要swap? 要回答这个问题,就需要回答swap…
Widget 类中,定义了一个 Bitmap 类型的私有数据成员 -- pb 指针 class Bitmap { ... }; class Widget { private: Bitmap *pb; // ptr to a heap-allocated object }; 1  重载 “op=”  当在 Widget 类中重载赋值操作符 "=" 时,需要考虑以下几个方面 1.1  链式赋值 (chain of assignments) 整数 15 首先赋值给 z,得到新值的 z 再赋值…
阅读此笔记前,请先阅读 <Effective C++>第二版笔记  和  <More Effective C++>笔记 这里只记录与上面笔记不同的条款,主要是 "面对对象+模板+内存管理" 三个方面 1.视 C++ 为一个语言联邦 可以分为 C.C with Object.Template C++.STL 四个次语言,不同次语言的高效编程守则可能不一样,比如 C 部分 pass-by-value 通常比 pass-by-reference 高效,而对于 Obje…
目前测试功能正常.若有不完善的地方在改进吧.时候不早了睡觉去,哎,翘课会被抓,不冒险了.晚安全世界O(∩_∩)O /************************************************************************* *my shared_ptr: share_ptr *author:ERIC *blog:http://www.ilovecpp.com *time:2015-5-28 01:36:43 ************************…
条款18:让接口容易被正确使用,不易被误用 1,好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达成这些性质. 2,“促进正使用”的办法包括接口的一致性,以及与内置类型的行为兼容. 3,“阻止误用”的办法包括建立新类型,限制类型上的操作,束缚对象值,以及消除客户的资源管理责任. 4,shared_ptr支持定制型删除器.这可以防范DLL问题,可以用来自动解除互斥锁. 条款19:设计class犹如设计type 博客地址:http://www.cnblogs.com/ronny/ …
http://www.cnblogs.com/fanzhidongyzby/archive/2012/11/18/2775603.html 1.让自己习惯C++ 条款01:视C++为一个语言联邦 条款02:尽量以const,enum,inline替换#define 条款03:尽可能使用const 条款04:确定对象被使用前已先被初始化 2.构造/析构/赋值运算 条款05:了解C++默默编写并调用哪些函数 条款06:若不想使用编译器自动成生的函数,就该明确拒绝 条款07:为多态基类声明Virtua…
条款18:让接口easy被正确使用,不易被误用 1,好的接口非常easy被正确使用,不easy被误用.你应该在你的全部接口中努力达成这些性质. 2,"促进正使用"的办法包含接口的一致性,以及与内置类型的行为兼容. 3,"阻止误用"的办法包含建立新类型,限制类型上的操作,束缚对象值,以及消除客户的资源管理责任. 4,shared_ptr支持定制型删除器.这能够防范DLL问题,能够用来自己主动解除相互排斥锁. 条款19:设计class宛如设计type 博客地址:http…
四.设计与声明          条款18:让接口容易被正确使用,不易被误用      理想上,如果客户企图使用某个接口而却没有获得他所预期的行为,这个代码不该通过编译:如果代码通过了编译,它的行为就应该是客户所想要的.欲开发一个“容易被正确使用,不容易被误用”的接口,首先必须考虑客户可能做出什么样的错误.    class Data{    public:           Data(int month,int day,int year)            ....     }    …
1.  视C++为一个语言联邦 C++高效编程守则视状况而变化,取决于你使用C++的哪一部分. 2.  尽量以const,enum.inline替代#define 1) 对于单纯常量,最好以const对象或enum替换#define 2) 对于形似函数的宏.最好改用inline函数替换#define 3)宁能够编译器替换预处理器 4)用define定义的名称并没有进入符号表.无法对其进行跟踪 3.  尽可能使用const 1)假设keywordconst出如今星号左边.表示被指物是常量:右边,指…
条款18:让接口更容易的被使用,不易误用 接口设计主要是给应用接口的人使用的,他们可能不是接口的设计者,这样作为接口的设计者就要对接口的定义更加易懂,让使用者不宜发生误用,例如对于一个时间类: class Date{ public: Data(int month, int day, int year){ .... } }: 在应用Date类的时候,对于Date的三个参数我们很容易用错,因为它们的类型相同,我们可能会将实参20传给month等,我们在设定接口的时候要保证接口使用过程中不管怎么用都会…
条款01:视C++为一个语言联邦(View C++ as a federation of languages.) C++主要的四个次语言: (1)C.说到底C++仍是以C为基础:(2)Object-Oriented C++.这部分也就是C with Classes所诉求的:类.封装.继承.多态.虚函数:(3)Template C++.这是C++的泛型编程(generic programming)部分:(4)STL.STL是个template程序库,是非常特殊的一个.它对容器.迭代器.算法以及函数…
条款一十三:以对象管理资源 1.把资源放进对象内,我们便可依赖C++的“析构函数自动调用机制“确保资源被释放. 2.auto_ptr是个”类指针对象“,也就是所谓”智能指针“,其析构函数自动对其所指对象调用delete. void f() { std::auto_ptr<Investment>pInv(createInvestment());//调用factory函数使用pInv经由auto_ptr的析构函数自动删除pInv ... } 获得资源后立即放进资源管理对象内.管理对象运用析构函数确…
Charpter 1. 让自己习惯C++   条款01: 视C++为一个语言联邦 条款02: 尽量以const,enum,inline替换#define 条款03: 尽可能使用const 条款04: 确定对象被使用前已先被初始化 Charpter 2. 构造/析构/赋值运算                           条款05: 了解C++默默编写并调用哪些函数 条款06: 若不想使用编译器自动生成的函数,就该明确拒绝 条款07: 为多态基类声明virtual析构函数 条款08: 别让异…
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter4 设计与声明 Designs and Declarations 条款18: 让接口容易被正确使用,不易被误用 欲开发一个"容易被使用,不容易被误用"的接口,首先必须考虑客户可能做出什么样的错误. 假设我们要设计一个表示日期的class: class Data{ public: Date(int month,int day,int year);…
01:视c++为一个语言联邦 为了理解C++,必须要认识其主要的次语言: C 说到底C++仍是以C为基础.区块,语句,预处理器,内置数据类型,数组,指针统统来自C. Object-Oreinted C++ 这一部分是面向对象设计之古典守则在C++上的最直接实施.类,封装,继承,多态,virtual函数等等... Template C++ 这是C++泛型编程部分. STL STL是个template程序库.包含容器(containers),迭代器(iterators),算法(algorithms)…