effective c++
文章平均质量分 79
onlyou2030
内心仰望理想的人都在埋头苦干!
展开
-
条款13:关于文中多次提及的auto_ptr和shared_ptr
标题中提到的auto_ptr和shared_ptr以及unique_ptr都是智能指针,其中auto_ptr是C++98提供的解决方案,后两个是C++11提供的另外两种解决方案。智能指针是行为类似于指针的类对象,但我们一般用他们来管理动态内存分配的智能指针模板。智能指针模板都定义了类似指针的对象,可以将new获得(直接或间接)的地址赋给这种对象,当智能指针过期时,其析构函数将使用delet原创 2015-10-03 09:36:54 · 358 阅读 · 0 评论 -
条款35(考虑virtual函数以外的其他选择)之Template Method模式和Strategy模式
Strategy策略模式作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。UML图:Strategy模式将逻辑(算法)封装到一个类(Context)里面,通过组合的方式将具体算法的实现在组合对象中实现,再通过委托的方式将抽象接口的实现委托给组合对象实现将算法的逻辑抽象接口(DoAction)封装到一原创 2015-10-04 22:28:22 · 405 阅读 · 0 评论 -
条款48提及的模板元编程
模板元编程(TMP)是编写template-based C++程序并执行与编译期的过程。TMP有两个伟大的效力。第一,它让某些事情更容易。第二,由于template metaprograms执行于C++编译期,因此可将工作从运行期转移到编译期。TMP没有真正的循环条件,所以循环效果由递归完成。下面是一个例子:#include using namespace std;//原创 2015-12-02 21:04:29 · 308 阅读 · 0 评论 -
条款49中关于new-handler行为
当operator new无法满足某一内存分配时,就会抛出一次。以前它会返回NULL指针,现在某些旧式编译器也还这么做。 namespace std{ typedef void(*new_handler)(); new_handler set_new_handler(new_handler p) throw(); }new_handler是个函数原创 2015-12-02 21:55:02 · 413 阅读 · 0 评论 -
条款24与条款46:关于类型转换与non-member函数
条款24:若所有参数皆需类型转换,请为此采用non-member函数通常情况,class不应该支持隐式类型转换,因为这样可能导致我们想不到的问题。这个规则也有例外,最常见的例外是建立数值类型时。例如编写一个有理数管理类,允许整数隐式类型转换为有理数似乎颇为合理。class Rational{ public: Rational(int numerator=0, int den原创 2015-12-02 16:42:52 · 320 阅读 · 0 评论 -
boost之scoped_array的使用
boost库是一个有着工业级强度的C++库,开源而且完全免费,有着C++准标准库的美誉,下面说一下boost库里的scoped_array使用方法.scoped_array使用起来很方便,轻巧,而且速度和原始指针相差无几. 而且更加安全..scoped_array主要有以下几个特点;1.构造函数接受的的指针必须是new[]返回的结果,而不能是new返回的结果.转载 2015-10-05 16:58:14 · 658 阅读 · 0 评论 -
条款31提及pimpl设计模式
条款31(将文件间的编译依存关系降至最低)中提到,由于头文件和其含入头文件之间形成一种编译依存关系,如果这些头文件所依赖的其他头文件有任何改变,那么每一个含入该头文件的的文件就要重新编译。为了减少这种依赖关系,文中提到一种“将对象实现细目隐藏于一个指针背后”的游戏。针对Person我们可以:把Person分割为两个classes,一个只提供接口,另一个负责实现该接口。Person定义如下:原创 2015-10-04 18:55:44 · 467 阅读 · 0 评论 -
条款04重难点
关于内置类型和STL的初始化就不多说了,下面主要来说下本节我认为的重点以及难点,对于难理解的部分,我尽量会试着实现来帮助理解。重点1:自定义类的初始化对于自定义类的初始化,很多人可能会混淆赋值和初始化。以下面的类为例:class PhoneNumber {};class ABEntry{public: ABEntry(const string &name, const原创 2015-10-03 11:16:46 · 275 阅读 · 0 评论 -
条款21:static对象引起的多线程安全性
看到条款21:必须返回对象时,别妄想返回其reference时,看到一句话“就像所有用上static对象的设计一样,这一个也立刻造成我们对多线程安全性的疑虑。”虽然多线程有一点了解,但多线程安全性居然还没听过(囧)。#include #include long global1 = 0;volatile long global2 = 0;class MyClass{public:原创 2015-10-03 14:34:26 · 749 阅读 · 0 评论 -
条款7中提及工厂method
一、概述 工厂方法是创建型模式,允许在不指定需要创建对象类型的情况下创建出对象。本质上来说,工厂方法就是一个通用的构造函数。C++中的构造函数有以下几种限制:1无返回值(No return result)。在构造函数中不能返回一个值。这就意味着:例如当构造失败时不能返回一个NULL作为初始化失败的信号。2 命名有约束(Constrained naming)。构造函数还是原创 2015-10-04 11:31:26 · 283 阅读 · 0 评论 -
条款35(考虑virtual函数以外的其他选择)之Template Method模式
看来有必要先看看设计模式了。。。。。。。Template模板方法模式作用:定义一个操作中的算法的骨架。而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。其关键是将通用算法(逻辑)封装在抽象基类中,并将不同的算法细节放到子类中实现。AbstractClass是抽象类,其实也就是一个抽象模板,定义并实现了一个模板方法。原创 2015-10-04 22:09:35 · 328 阅读 · 0 评论 -
条款25:全特化和偏特化
条款25:考虑写出一个不抛异常的swap函数,中提到了模板的全特化,很遗憾,我又没有听过。全特化:就是全部特化,即针对所有的模板参数进行特化。偏特化:就是部分特化,即针对部分模板参数进行特化。#include using namespace std;template T mymax(const T t1, const T t2){ return t1 < t2 ? t2 :原创 2015-10-03 16:06:50 · 391 阅读 · 0 评论 -
条款20:宁以pass-by-reference-to-const替换pass-by-value
前面的道理我都懂,什么pass-by-value会调用赋值构造函数和析构函数,成本高,而pass-by-reference-to-const可以回避构造和析构。后面提到by-reference方式传递参数也可以避免sliding(对象切割)问题。 ~~~等等,对象切割是什么鬼,effective C++果然有100种方式让我看不下去。1.对象切割首先我自己举个简单的例子,说明:原创 2015-10-03 14:05:57 · 362 阅读 · 0 评论 -
条款14:在资源管理中心小心copy行为之重难点
不仅仅动态分配的内存是资源,像文件描述器,互斥锁,数据库连接,以及网络sockets等也是资源,如果不及时关闭,也会造成资源浪费。重点1:建立自己的资源管理类如果是heap-based资源,则可以用auto_ptr或shared_ptr管理资源。然而并非所有资源都是heap-based,这样,就需要建立自己的资源管理类。以互斥锁为例,为确保不会忘记将一个被锁住的mutex解锁,我们希望原创 2015-10-04 13:49:26 · 598 阅读 · 0 评论