
effective c++
文章平均质量分 87
ruan875417
这个作者很懒,什么都没留下…
展开
-
【effective c++读书笔记】【第0章】导读
1、 所谓声明式(declaration)是告诉编译器某个东西的名称和类型,但略去细节。所谓定义式(definition)是提供编译器一些声明式所遗漏的细节。对对象而言,定义式是编译器为此对象拨发内存的地点。对function或function template而言,定义式提供了代码本体。对class或class template而言,定义式列出它们的成员。 //声明式extern int原创 2015-07-28 19:17:18 · 365 阅读 · 0 评论 -
【effective c++读书笔记】【第8章】定制new和delete(2)
条款50:了解new和delete的合理替换时机有人会想要替换掉编译器提供的operator new或operator delete,以下是几个理由:a、用来检测运用上的错误。编程过程中会出现各种错误。这些错误导致内存泄露(memory leaks)、不确定行为产生、overruns(写入点在分配区块尾端之后)、underruns(写入点在分配区块尾端之前)等的发生。定制的operator原创 2015-08-19 09:57:05 · 473 阅读 · 0 评论 -
【effective c++读书笔记】【第8章】定制new和delete(1)
条款49:了解new-handler的行为1、当operator new无法满足某一内存分配需求时,它会抛出异常,以前会返回null指针。当operator new抛出异常以反映一个未获满足的内存需求之前,它会先调用一个客户指定的错误处理函数,一个所谓的new-handler。为了指定这个“用以处理内存不足”的函数,客户必须调用set_new_handler,它是声明于的一个标准程序库函数:原创 2015-08-18 15:01:19 · 398 阅读 · 0 评论 -
【effective c++读书笔记】【第5章】实现(2)
条款29:为“异常安全”而努力是值得的1、在异常抛出时,带有异常安全性的函数会:a、不泄露任何资源b、不允许数据败坏2、异常安全函数(Exception-safefunctions)提供以下三个保证之一:a、基本承诺:如果异常被抛出,程序内的任何事物仍然保持在有效状态下。没有任何对象或数据结构会因此而败坏,所有对象都处于一种内部前后一致的状态。然而程序的现实状态不可预料。b原创 2015-08-05 16:16:53 · 421 阅读 · 0 评论 -
【effective c++读书笔记】【第5章】实现(1)
条款26:尽可能延后变量定义式的出现时间1、只要你定义了一个变量而其类型带有一个构造函数或析构函数,那么当程序的控制流到达这个变量定义式时,你便得承受构造成本;当这个变量离开其作用域时,你便得承受析构成本。即使这个变量最终并为被使用,仍需耗费这些成本,所以应该尽量避免这种情形。例子:std::string encryptPassword(const std::string& passw原创 2015-08-04 20:35:25 · 482 阅读 · 0 评论 -
【effective c++读书笔记】【第7章】模板和泛型编程(3)
条款46:需要类型转换时请为模板定义非成员函数对条款24的例子进行模板化:#includeusing namespace std;templateclass Rational{public: Rational(const T& n = 0, const T& d = 1) :numerator(n), denominator(d){}//构造函数刻意不为explicit,为了隐原创 2015-08-17 13:24:04 · 615 阅读 · 0 评论 -
【effective c++读书笔记】【第7章】模板和泛型编程(2)
条款44:将与参数无关的代码抽离templatestemplate是节省时间和避免重复代码的一个奇妙方法。class template的成员函数只有在被使用时才被暗中具现化。但是如果不小心,使用templates可能导致代码膨胀(code bloat):其二进制代码带着重复(或几乎重复)的代码、数据、或两者。其结果可能源码看起来合身整齐,但目标码却不是那么回事。假设你想为固定尺寸的正方矩阵原创 2015-08-16 13:34:26 · 450 阅读 · 0 评论 -
【effective c++读书笔记】【第7章】模板和泛型编程(1)
条款41:了解隐式接口和编译期多态1、模板的编译期多态例子:#includeusing namespace std;class ClassA{public: ClassA(size_t s) :size(s){} size_t getSize() const{ return size; }private: size_t size;};class ClassB{pu原创 2015-08-15 20:36:47 · 468 阅读 · 0 评论 -
【effective c++读书笔记】【第4章】设计与声明(1)
条款18:让接口容易被正确使用,不容易被误用1、许多客户端错误可以因为导入新类型而获得预防。在防范“不值得拥有的代码”上,类型系统是你的主要同盟国。2、预防客户错误的另一个办法是,限制类型内什么事可做,什么事不能做。常见的限制是加上const。3、除非有好理由,否则应该尽量令你的types的行为与内置types一致。4、tr1::shared_ptr有一个特别好的性质是:它会自动使原创 2015-08-02 21:55:00 · 449 阅读 · 0 评论 -
【effective c++读书笔记】【第6章】继承与面向对象设计(4)
条款39:明智而审慎的使用private继承1、如果classes之间的继承关系是private,编译器不会自动将一个derived class对象转换为一个base class对象。例子:#include#includeusing namespace std;class Person{protected: string name;};class Student :pr原创 2015-08-14 14:07:09 · 382 阅读 · 0 评论 -
【effective c++读书笔记】【第4章】设计与声明(2)
条款22:将成员变量声明为private1、 如果成员变量不是public,客户唯一能够访问对象的办法就是通过成员函数。如果public接口内的每样东西都是函数,客户就不需要再打算访问class成员时迷惑地试着记住是否该使用小括号。2、使用函数可以让你对成员变量的处理有更精确的控制。如果你令成员变量为public,每个人都可以读写它,但如果你以函数取得或设定其值,你就可以出现“不准访问”、原创 2015-08-03 19:41:24 · 504 阅读 · 0 评论 -
【effective c++读书笔记】【第3章】资源管理
条款13:以对象管理资源1、例子:#includeusing namespace std;class Test{public: Test(){ cout << "Test构造" << endl; } ~Test(){ cout << "Test析构" << endl; }};Test* createTest(){ return new Test();}void f()原创 2015-08-01 15:53:55 · 451 阅读 · 0 评论 -
【effective c++读书笔记】【第6章】继承与面向对象设计(3)
条款36:绝不重新定义继承而来的non-virtual函数1、例子#includeusing namespace std;class Base{public: void mf(){ cout << "Base::mf()" << endl; }};class Derived :public Base{public: void mf(){ cout << "Derived:原创 2015-08-13 14:20:26 · 409 阅读 · 0 评论 -
【effective c++读书笔记】【第2章】构造/析构/赋值运算(2)
条款09:绝不在构造和析构过程中调用virtual函数例子:#include#includeusing namespace std;class Base{public: Base(){ test(); } virtual void test(){ cout << "Base test" << endl; }};class Derived :public Base{pu原创 2015-07-31 15:46:46 · 406 阅读 · 0 评论 -
【effective c++读书笔记】【第6章】继承与面向对象设计(2)
条款35:考虑virtual函数以外的其他选择假设你在开发一款游戏,你打算为游戏内的人物设计一个继承体系。每个人物都有自己的健康状态。你能马上想到下面这个设计:class GameCharacter{public: virtual int healthValue()const;};有没有其他替代方案呢?答案是肯定的。1、藉由Non-Virtual Interface手法原创 2015-08-12 16:24:09 · 371 阅读 · 0 评论 -
【effective c++读书笔记】【第2章】构造/析构/赋值运算(1)
条款05:了解C++默默编写并调用哪些函数1、如果你自己没声明,编译器就会为类声明(编译器版本的)一个拷贝构造函数,一个拷贝赋值操作符和一个析构函数。此外如果你没有声明任何构造函数,编译器也会成为你声明一个默认构造函数。所有这些函数都是public且inline。惟有当这些函数被需要(被调用),它们才会被编译器创建出来。即有需求,编译器才会创建它们。例如:class Empty{};原创 2015-07-30 15:40:29 · 409 阅读 · 0 评论 -
【effective c++读书笔记】【第6章】继承与面向对象设计(1)
条款32:确定你的public继承塑模出is-a关系1、以C++进行面向对象编程,最重要一个规则是:public inheritance(公开继承)意味着“is-a”(是一种)的关系。如果令class D(“Derived”)以public形式继承class B(“Base”),便告诉C++编译器(及代码读者)说,每一个类型为D的对象同时也是一个类型为B的对象反之不成立。B比D表现出更一般化的原创 2015-08-11 15:18:12 · 368 阅读 · 0 评论 -
【effective c++读书笔记】【第1章】让自己习惯C++
条款01:视C++为一个语言联邦1、C++可以分为四个主要的次语言:1)C。说到底C++仍是以C为基础。区块,语句,预处理器,内置数据类型,数组,指针统统来自C。2)Object-Oreinted C++。这一部分是面向对象设计之古典守则在C++上的最直接实施。类,封装,继承,多态,virtual函数......等等3)Template C++。这是C++泛型编程部分。4)原创 2015-07-29 14:28:28 · 399 阅读 · 0 评论 -
【effective c++读书笔记】【第9章】杂项讨论
条款53:不要轻忽编译器的警告警告信息天生和编译器相依,不同的编译器有不同的警告标准。所以草率编程后依赖编译器为你指出错误,并不可取。请记住:严肃对待编译器发出的警告信息。努力在你i的编译器的最高(最严苛)警告级别下争取“无任何警告”的荣誉。不要过度依赖编译器的报警能力,因为不同的编译器对待事情的态度并不相同。一旦移植到另一个编译器上,你原本依赖的警告信息有可能消失。原创 2015-08-20 13:51:39 · 332 阅读 · 0 评论