读书笔记
nosmatch
这个作者很懒,什么都没留下…
展开
-
Effective C++ 读书笔记(2)
条款二:尽量以const,enum,inline替换#define对于条款二,可以理解为能在编译器期间做的事情不要放到预编译器中处理,预编译器是对程序编译之前的一个预先的处理,不会检查对代码最任何的检出,这样如果在编译期间发现问题,如果问题是我们自己直接造成的那可能会很快的定位,想反的如果问题在预编译期间做了一些处理,那样在编译中出现的问题可能会显示预编译中的问问题,这样对问题定位不方便,原创 2013-07-07 17:10:14 · 632 阅读 · 0 评论 -
Effective C++ 读书笔记(18)
条款18:让接口更容易的被使用,不易误用接口设计主要是给应用接口的人使用的,他们可能不是接口的设计者,这样作为接口的设计者就要对接口的定义更加易懂,让使用者不宜发生误用,例如对于一个时间类:class Date{public: Data(int month, int day, int year){ .... }};在应用Date类的时候,对于D原创 2013-07-13 15:06:31 · 622 阅读 · 0 评论 -
Effective C++ 读书笔记(23)
条款23:宁以non-member、non-friend替代member函数原创 2013-07-14 15:59:04 · 683 阅读 · 0 评论 -
Effective C++ 读书笔记(24)
条款24:若所有参数皆需要类型转换,请为此采用non-member函数考虑一个有理数的类:class Ration{public: Ration(int numerator = 0, int denominator = 1); int numerator() const; int denominator() const;private: int numerator; in原创 2013-07-14 22:01:09 · 773 阅读 · 0 评论 -
Effective C++ 读书笔记(21)
条款21:必须返回对象时别妄想返回reference上一个条款讲解了以pass-by-reference来替代pass-by-value可以很好的增加效率,但是pass-by-reference也是不能乱用的本条款主要讲在函数返回对象的时候不应该让他返回一个reference!上例子:class Ration{public: Ration(int numerator,i原创 2013-07-14 11:42:45 · 785 阅读 · 0 评论 -
Effective C++ 读书笔记(22)
条款22:将成员变量声明为private对于C++而已,封装型是其三大特征之一,之所以封装型是如此的重要,是因为封装型能为接口的使用者提供透明的服务,内部的任何改变对其客户使用者来说都是透明的,都不需要做任何的改变,将class中的成员变量设为private的并且为成员变量设定对应的接口函数,这样外面的调用者只能通过接口函数来使用成员变量,对成员变量的任何改动只要接口不变都是可原创 2013-07-14 12:33:36 · 686 阅读 · 0 评论 -
Effective C++读书笔记(26)
条款26:尽可能延后变量定义式的出现时间当你定义一个变量的时候就要保证这个变量能够在程序中使用到,不要定义无意义的变量,这样就要求我们最好是在变量使用到的时候才做定义,因为如果一个变量定义了却乜有使用可能会造成效率上的降低,毕竟很多变量的构建是要调用对应的构造函数和析构函数的,考虑下面的例子:std::string setName(std::string& name原创 2013-07-16 08:20:45 · 771 阅读 · 0 评论 -
Effective C++ 读书笔记(25)
条款25:考虑写出一个不抛出任何异常的swap函数原创 2013-07-16 07:53:11 · 600 阅读 · 0 评论 -
Effective C++读书笔记(27)
条款27:尽量少做转型动作在C++中尽量的少用类型的转化,只要有类型转化的地方就是有可能会出现问题的地方,在C++中有四种强制类型转化,如下:1、static_cast用法:static_cast(expression)该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:①用于类层次结构中基类和子原创 2013-07-16 23:34:54 · 709 阅读 · 0 评论 -
Effective C++ 读书笔记(30)
条款30:透彻了解inline函数的里里外外inline函数是直接将函数调用用函数的本体来替换,这样就免去了函数调用时候的消耗,但是由于每次对于函数的调用都会用函数的本体来替换,因此过度的应用inline函数会对程序的代码造成膨胀,会造成指令缓冲的命中率,因此我们在应用inline函数的时候也一定要把握好度!看下面的例子:class Base{public: B原创 2013-07-20 14:53:29 · 831 阅读 · 0 评论 -
Effective C++ 读书笔记(28)
条款28:避免返回handle指向对象内部成分首先handle是指reference、指针和迭代器等都可以称之为handle,因为她们都是用来取得一个对象的,返回一个handle指向对象的内部成分主要会造成下面的两种情况:1.增大了成员的访问权限,如下例子:class Point{public: Point(int x, int y); ... void set原创 2013-07-20 11:49:37 · 981 阅读 · 0 评论 -
Effective C++ 读书笔记(29)
条款29:为“异常安全”而努力是值得的在程序中抛出异常的时候,带有异常安全的函数会保证:1.不泄露任何的资源2.不允许数据被破坏对于第一种情况可以采用资源管理类的方法来保证资源的释放,我们的函数都要保证异常发生时函数的保证:1.基本承诺,函数发生异常时,对象还能保持正常的状况,但是具体处于那种状态是不确定的2.强烈保证,函数发生异常时,如果函数成功则完全成功,如果失败则原创 2013-07-20 12:26:29 · 649 阅读 · 0 评论 -
Effective C++ 读书笔记(35)
条款35:考虑virtual函数意外的其他选择原创 2013-07-21 17:24:10 · 755 阅读 · 0 评论 -
Effective C++ 读书笔记(36)
条款36:绝不重新定义继承而来的non-virtual函数class B{public: void func(); ...};class D:public B{public: ...};在上面的简单例子中,如果有下面的调用:D x;B* p = new D();D* q = new D();p->func();q->func();此时上面的两个调用调用的原创 2013-07-21 17:44:00 · 927 阅读 · 0 评论 -
Effective C++读书笔记(31)
条款31:将文件间的编译依赖关系降到最低在C++中我们要将接口与实现分离开来,这样只要接口没有改变,对接口应用的客户就可以保持不变,例如:class Person{public: Person(const std::string& name, const Date& birthday, const Address& addr); std::string name() c原创 2013-07-21 11:19:04 · 743 阅读 · 0 评论 -
Effective C++读书笔记(32)
条款32:确定你的public继承塑模出is-a关系以public继承的类,其父类的所有的性质都应该使用与子类,任何需要父类的地方都应该能用子类来代替,任何子类类型的对象也同时是父类的:class Person{...};class Student : public Person{...};void eat(const Person& p);void study(co原创 2013-07-21 12:16:21 · 863 阅读 · 0 评论 -
Effective C++读书笔记(33)
条款33:避免遮掩继承而来的名称对于继承的父类中的函数,如果在子类中有同名的函数,则父类中的同名函数都将被隐藏,例如:class Base{private: int x;public: virtual void mf1() = 0; virtual void mf1(int x); virtual void mf2(); void mf3(); void mf3(dou原创 2013-07-21 15:11:28 · 759 阅读 · 0 评论 -
Effective C++ 读书笔记(17)
条款17:以独立的语句将new的资源放入到智能指针中考虑以下情况:int prirority();void processWidget(std::shared_ptr pw, int priority);我们在对processWidget函数进行调用的时候,可以采用如下形式:processWidget(std::shared_ptr pw(new widget), prior原创 2013-07-12 09:15:12 · 582 阅读 · 0 评论 -
Effective C++ 读书笔记(20)
条款20:宁以pass-by-reference-to-const替换pass-by-value考虑下面的例子:class People{public: Person(); virtual ~People(); ...private: std::string name; std::string address;};class Student:public Peopl原创 2013-07-13 16:57:51 · 612 阅读 · 0 评论 -
Effective C++ 读书笔记(4)
条款四:确定对象在使用前已经初始化这一条也可以说是在成员定义的时候同时赋予一个初始的数值,有过C编程经验的人对指针定义的初始化应该不陌生,指针定义的时候同时给予一个初始化的值,一般是为NULL,这样就不会出现野指针的情况,同时在指针空间释放的时候也注意将对应的指针赋予一个NULL的值,这样就不会出现指针指向一个无效的地址的情况!同样在C++里面,类作为主要的自定义类型,其成员原创 2013-07-08 22:24:41 · 763 阅读 · 0 评论 -
Effective C++ 读书笔记(1)
Effective C++ 读书笔记(条款1):视C++为一个语言联邦 做为一个半路出家的IT人,断断续续的学习编程也学了有两年多了,经过两年多的学习,感觉现在才开始慢慢的入门,刚开始学的时候感觉学习编程语言就是学习编程,慢慢的才感觉到语言只是一个解决问题的工具而已,他就是人与计算机交互的一个媒介,跟汉语、英语等没有什么本质的不同,相反别那些语言简单多了吧,后来慢慢的不在去刻意的原创 2013-07-07 15:59:37 · 800 阅读 · 0 评论 -
Effective C++ 读书笔记(5)
条款五:了解C++默默编写并调用那些函数是否处在空的类?假设定义类为class Empty{};当C++编译器处理过后会变成如下的形式:class Empty{ Empty(){} ~Empty(){} Empty& operator=(const Empty& rhs){.....} Empty(const Empty& rhs){.....}}可以分别称为构造函数,原创 2013-07-08 22:51:18 · 523 阅读 · 0 评论 -
Effective C++ 读书笔记(6)
条款六:如果不想使用编译器自动生成的函数,就应该明确的拒绝(不要搞暧昧!)C++是一个比较复杂的语言,包含的模块比较多,我们写程序的一个原则就是不用的功能就要明确的禁止掉,这样就会防止在意想不到的情况下出现调用,C++瞒着你在背后做了太多的事情了!对于一个独一无二的对象,例如前面的People对象,每个人都是唯一的,因此我们不想在People类中出现copy构造函数和原创 2013-07-08 23:21:27 · 585 阅读 · 0 评论 -
Effective C++ 读书笔记(3)
条款三:尽量的使用const条款二对const关键字进行了简单的介绍,主要是介绍了const对一些预处理定义的替换使用,本条款主要是讲const作为一个常量修饰的一个寓意的约束,总之就是一句话:在能使用const的地方尽量使用const!1.const对于基本内置类型的约束,主要指的是指针类型。对于指针类型有下面两种约束的方式:const int * pi;int原创 2013-07-07 23:05:26 · 633 阅读 · 0 评论 -
Effective C++ 读书笔记(7)
条款七:为多态的基类声明virtual析构函数任何的类都会有构造函数和析构函数,当你没有显示的定义的时候编译器会给你定义默认的构造和析构函数,普通的类也就是不做任何类的父类的类,其对应函数的定义与其他成员函数的定义是相类似的,对于基类,由于基类的属性要被对应的子类继承,因此也会有不同的属性!在父类中,如果存在任何的virtual虚函数,那么这个类的析构函数也最好声明为virtu原创 2013-07-10 00:05:19 · 604 阅读 · 0 评论 -
Effective C++ 读书笔记(8)
条款八:别让异常逃离析构函数异常判断是与C语言不同一个功能,带来方便的同时也会带来一些问题,例如:class widget{public: .... ~widget(){}};void doSomething(){ std::vecotr v; .....}在doSomething的函数结束的时候,vector中的对象会对应的调用widget类原创 2013-07-10 00:28:42 · 611 阅读 · 0 评论 -
Effective C++ 读书笔记(11)
条款11:在operator=中处理“自我赋值”自我赋值是指将对象自己赋值给自己;例如People p;...p = p;虽然这看起来比较好笑,但是这种情况很可能会出现的,例如当你对两个指针进行赋值操作的时候,两个指针指向的对象就可能是同一个,在C++中,由于多态的出现,类型不同的指针或者引用也可能指向同一个对象,例如:class People{...};class原创 2013-07-10 10:18:48 · 659 阅读 · 0 评论 -
Effective C++ 读书笔记(10)
条款10:让操作符=返回一个reference to *this对一些存在的操作符重载的时候,最好是要兼容这些操作符本身就有的属性,例如对于操作符=,可以实现连等的操作,例如int a = b = c = 10;这样可以认为10先赋值给c,然后c的值又赋值给b,b的值最后赋值给a,同样的对于类中操作符=的重载也要支持这样的操作,那么可以将operator返回操作符的左值,为了效原创 2013-07-10 09:31:43 · 949 阅读 · 0 评论 -
Effective C++ 读书笔记(12)
条款12:复制对象时勿忘其每一个成分C++中类会将成员都封装起来,类的copy操作只能通过赋值函数和复制构造函数,在进行对应的copy操作的时候注意要将成员的没一个成员进行对应的复制!例如:原创 2013-07-10 22:14:43 · 519 阅读 · 0 评论 -
Effective C++ 读书笔记(13)
条款13:以对象来管理资源在C++中我们经常会涉及到资源的申请与申请,一般都是由关键字new 和 delete来操作的,两者都是成对存在的,缺一不可,否则会出现意想不到的问题,例如:class Investment{.....};Investment* pinv = createInvestment();我们在使用完后要动态的释放掉pinv所指向的资源,例如在原创 2013-07-11 08:53:58 · 673 阅读 · 0 评论 -
Effective C++ 读书笔记(15)
条款15:在资源管理类中提供对原始资源的访问原创 2013-07-12 08:06:50 · 579 阅读 · 0 评论 -
Effective C++ 读书笔记(16)
条款16:当成对的使用new 和 delete时,要确保new 和 delete的格式是相同的这个条款比较简单,但是却很容易出错,首先我们看下当我们使用new和delete的时候编译器为我们做了什么,当我们调用new操作符的时候,编译器会首先在内存中帮我们申请一块空间,然后调用对应对象的构造函数,想对应的当我们调用delete的时候,编译器会首先在该空间调用对应的析构函数然后再原创 2013-07-12 08:24:37 · 589 阅读 · 0 评论 -
Effective C++ 读书笔记(9)
条款九:绝对不要在构造函数或者析构函数中调用virtual函数首先上例子:class People{public: People(); virtual void task() const = 0; ....};People::People(){ .... task();}class Studeng : public People{public: virtua原创 2013-07-10 00:54:36 · 631 阅读 · 0 评论 -
Effective C++ 读书笔记(14)
条款14:在资源管理类中小心copying行为在条款中主要的介绍了智能指针的用法,那里解决为问题是指向一个heap空间的指针的申请与释放问题,然而并非所有的资源都是在heap中申请的,这时候智能指针就不适合了,例如对于类型为Mutex的互斥器对象,只有lock和unlock的操作,在这里lock与unlock是成对存在的,为了防止调用lock后忘记unlock我们可以自己管理资原创 2013-07-11 23:22:30 · 811 阅读 · 0 评论 -
Effective C++ 读书笔记(19)
条款19:设计class犹如设计type条款主要的是介绍在设计class的时候应该注意的问题,只要有以下几点:1.新的type的对象应该如何被构造和析构,主要是指的新的type的构造函数和析构函数的定义2.对象的初始化和对象的赋值有什么样的区别,主要是新type的复制构造函数和赋值函数的定义3.新的type的对象如果被passed by value 将以为这什么?4.什么是原创 2013-07-13 15:42:33 · 576 阅读 · 0 评论 -
Effective C++读书笔记(34)
条款34:区分接口继承和实现继承在对Base class 进行public继承的时候,根据Base class中成员函数的类型我们能够得到不同的继承方式:如下:class Shape{public: virtual void draw() const = 0; virtual void error(const std::string& msg); int objectId()原创 2013-07-21 16:41:08 · 898 阅读 · 0 评论