Effective C++: 05实现】的更多相关文章

String s = new String("stringette"); // Don't do this. This will create an object each time Vs String s = "stringette"; class Person { private final Date birthDate; // Other fields, methods, and constructor omitted /** * The starting a…
主要讲了 1. 一般情况下编译器会为类创建默认的构造函数,拷贝构造函数和copy assignment函数 2. 执行默认的拷贝构造/copy assignment函数时,如果成员有自己的拷贝构造/copy assignment函数就执行它,否则就按bit拷贝/赋值 3. 几种编译器不会为类生成默认的copy assigment操作的情况 这几种情况如下: a. 类里面已经有了相应的的构造函数,拷贝构造函数,copy assignment函数.此时再生成默认的这些函数就失去其原来的意义了. b.…
30:Proxy classes 代理类 在C++中使用变量作为数组大小是违法的,也不允许在堆上分配多维数组: int data[dim1][dim2]; int *data = new int[dim1][dim2]; // error! 为了弥补上述缺点,可以设计一个二维数组类: template<class T> class Array2D { public: Array2D(int dim1, int dim2); ... }; Array2D<, ); Array2D<,…
29:引用计数 本章首先实现一个带引用计数String,然后逐步优化,介绍引用计数的常规实现. 实现引用计数的String,首先需要考虑:引用计数在哪存储.这个地方不能在String对象内部,因为需要的是每个String值一个引用计数值,这意味着String值和引用计数间是一一对应的关系,因此需要创建一个类来保存引用计数及其跟踪的值.我们叫这个类StringValue.下面就是一个引用计数String的最简单实现: class String { public: String(const char…
25:将constructor 和 non-member functions 虚化 所谓 virtual constructor是某种函数,视其输入可产生不同类型的对象.比如下面的代码: class NLComponent { public: ... }; class TextBlock: public NLComponent { public: ... }; class Graphic: public NLComponent { public: ... }; class NewsLetter…
26:尽可能延后变量定义式的出现时间 1:只要你定义了一个变量而其类型带有一个构造函数或析构函数,那么当程序的控制流到达这个变量定义式时,你便得承受构造成本:当这个变量离开其作用域时,你便得承受析构成本.即使这个变量最终并未被使用,仍需耗费这些成本,所以你应该尽可能避免这种情形. 2:像下面这个函数: std::string encryptPassword(const std::string& password) { using namespace std; string encrypted;…
Hi guys, I am happy to tell you that I am moving to the open source world. And Java is the 1st language I have chosen for this migration. It's a nice chance to read some great books like "Effective Java 2nd Edition" and share the note for what I…
面对“内含reference成员或者含const成员”的class内支持赋值操作,你必须自己定义copy assignment操作符. 如果某个base classes将copy assignment操作符声明为private,编译器将拒绝为其derived classes 生成一个copy assignment操作符.…
一.如果用户没有提供构造函数.copy构造函数.copy assignment操作符和析构函数,当且仅当这些函数被需要的时候,编译器才会帮你创建出来.编译器生成的这些函数都是public且inline. 当你写下这样一个类的时候: class Empty {}; 如果上述的函数是被需要的话,那么编译自动会帮你把类修改为,如下: class Empty { public: Empty() {...}; //这里进行数据成员的默认初始化,如果有虚函数的话,这里还会配置好虚函数表 Empty(cons…
1. 当只写一个空类的时候,编译器会为他声明一个copy构造函数,一个copy assignment函数和一个析构函数.如下: 如果写下: class Empty{ }; 编译器就会实现以下代码: class Empty{ Empty(){} //默认构造函数 Empty(const Empty& rhs ) {} //复制构造函数 ~Empty() {} //析构函数 Empty& operator=( const Empty& rhs ) {} // 复制赋值操作符}; 编译器…
条款26:尽可能延后变量定义式的出现时间 博客地址:http://blog.csdn.net/cv_ronny 转载请注明出处! 有些对象,你可能过早的定义它,而在代码运行的过程中发生了导常,造成了開始定义的对象并没有被使用,而付出了构造成本来析构成本. 所以我们应该在定义对象时,尽可能的延后,甚至直到非得使用该变量前一刻为止,应该尝试延后这份定义直到可以给它初值实參为止. 这样做的优点是:不仅能够避免构造(析构)非必要对象,还能够避免无意义的default构造行为. 遇到循环怎么办?此时往往我…
1. 如果对象是不可变的(immutable),它就始终可以被重用. (1) 特别是String类型的对象. String str1 = new String("str"); // 创建许多不必要的实例 String str2 = "str"; // "str"其本身是一个String实例,对于所有同一台虚拟机中运行的代码,只要它们包含相同的字符串字面常量,该对象就会被重用 (2) 同时提供了静态工厂方法和构造器的不可变类,通常可以使用静态工厂方…
规则一 编译器默认操作 // 你认为 class Empty { }; // 实际上 class Empty { public: Empty() { ... } // default 构造函数 Empty(const Empty& rhs) { ... } // copy 构造 ~Empty() { ... } // 析构函数 Empty& operator=(const Empty& rhs) { ... } // copy assignment 操作符 } // 调用 Empt…
class Empty{}; class Empty{ Empty(){}; Empty(const Empty& rhs){}; ~Empty(){}; Empty& operator=(const Empty& rhs){}; }; 只有当生成的代码合法且证明它有意义时编译器才会为class生成operator= template<class T> class NameObject{ private: string& nameValue; const T o…
移动语义使得编译器得以使用成本较低的移动操作,来代替成本较高的复制操作:完美转发使得人们可以撰写接收任意实参的函数模板,并将其转发到目标函数,目标函数会接收到与转发函数所接收到的完全相同的实参.右值引用是将这两个不相关的语言特性连接起来的底层语言机制,正是它使得移动语义和完美转发成了可能. 23:理解std::move和std::forward std::move并不进行任何移动,std::forward也不进行任何转发.这两者在运行期都无所作为,它们不会生成任何可执行代码.实际上,std::m…
http://www.cnblogs.com/littlethank/archive/2011/12/15/2288787.html http://www.cnblogs.com/liao-xiao-chao/archive/2011/05/30/2062609.html http://www.cnblogs.com/ronny/p/3737044.html more effective c++ http://www.cnblogs.com/tianyajuanke/archive/2012/1…
“1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaScript笔记]第3条:当心隐式的强制转换> 因为这个会在比较之前对两个值都进行隐式转换.字符串“1.0e0”被解析成1,而{valueOf:function(){return true;}}会通过调用自身的valueOf进行转化得到true,然后再转化为数字,得到1; 很容易使用强制转换完成一些工作.如…
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…
概要 本章是从<Effective Java>摘录整理出来的关于异常处理的几条建议.内容包括:第1条: 只针对不正常的情况才使用异常第2条: 对于可恢复的条件使用被检查的异常,对于程序错误使用运行时异常第3条: 避免不必要的使用被检查的异常第4条: 尽量使用标准的异常第5条: 抛出的异常要适合于相应的抽象第6条: 每个方法抛出的异常都要有文档第7条: 在细节消息中包含失败 -- 捕获消息第8条: 努力使失败保持原子性第9条: 不要忽略异常 它们对应原书中"第8章 异常"部分…
223本电子书籍,囊括了.NET/ASP.NET/C#/WCF/SQL Server/My SQL/Java/JSP/JDBC/Spring/Spring MVC/PHP/Python/Shell/Agile/CSS/HTML/HTTP/Unix/Linux在内的大量PDF书籍/电子书籍,重点是还包括的了很多技术大牛的干货分享. 经典书籍包括: 01.<Java编程思想> 02.<Effective Java - 2nd Edition> 03.<深入理解Java虚拟机 JV…
条款05 : 了解C++默默编写并调用哪些函数 编译器可以暗自为class创建default构造函数.copy构造函数.copy assignment操作符,以及析构函数. 1. default构造函数和析构函数:主要是给编译器一个地方用来放置“藏身幕后”的代码,像是调用base classes和non-static成员变量的构造和析构函数:当我们显式声明了一个构造函数,编译器于是不再为我们的类创建default构造函数. 2. 如果你打算在一个“内含reference成员”的class内支持赋…
记得前段时间又一次拿起<Effective C++>的时候,有种豁然开朗的感觉,所以翻出了我第一遍读时做的笔记.只做参考以及查阅之用.如有需要请参阅<Effective C++>书本. by shenzi/2010.5.17 一.让自己习惯C++    条款01:视C++为一个语言联邦    为了更好的理解C++,我们将C++分解为四个主要次语言: C.说到底C++仍是以C为基础.区块,语句,预处理器,内置数据类型,数组,指针统统来自C. Object-Oreinted C++.这…
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(2)-读书笔记 <Effective C++>第3章 资源管理(1)-读书笔记 <Effective C++>第3章 资源管理(2)-读书笔记 <Effective C++>第4章 设计与声明(1)-读书笔记 <Eff…
阅读effective c++ 04 (30页) 提到的static对象和堆与栈对象.看了看侯老师的内存管理视频1~3.有点深. 了解一下. 目录 1 内存管理 1.1 C++内存管理详解 1.1.1 内存分配方式 1.1.2 控制C++的内存分配 1.1.3 常见的内存错误及其对策 1.1.4 指针与数组的对比 1.1.5 指针参数是如何传递内存的? 1.1.6 杜绝"野指针" 1.1.7 有了malloc/free为什么还要new/delete? 1.1.8 内存耗尽怎么办? 1.…
百度云及其他网盘下载地址:点我 编辑推荐 <Effective C++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)>前两个版本抓住了全世界无数程序员的目光.原因十分明显:Scott Meyers极富实践意义的C++研讨方式,描述出专家用以产出干净.正确.高效代码的经验法则和行事法则——也就是他们几乎总是做或不做的某些事.<Effective C++:改善程序与设计的55个具体做法(第3版)(中文版)(双色)>一共组织55个准则,每一条准则描述一个编写出更好的C++的…
第一部分 让自己习惯C++ 条款01:视C++为一个语言联邦 一.要点 ■ c++高效编程守则视状况而变化,取决于你使用c++的哪一部分. 二.扩展 将c++视为一个由相关语言组成的联邦而非单一语言会帮助你更好的理解,其由c.object-oriented c++.template c++和stl四部分组成. 条款02:尽量以const,enum,inline替换#defines 一.要点 ■ 对于单纯变量,最好以const对象或enums替换#defines. ■ 对于形似函数的宏,最好改用i…
Effective C++算是看完了,但是并没有完全理解,也做不到记住所有,在此记录下55个条款及条款末的"请记住". 让自己习惯C++ 条款01:视C++为一个语言联邦 ① C ② Object-Oriented C++ ③ Template C++ ④ STL 条款02:尽量以const,enum,inline替换#define ① 对于单纯常量,最好以const对象或enums替换#define ② 对于形似函数的宏,最好改用inline函数替换#define 条款03:尽可能使…
1.让自己习惯C++ 条款01:视C++为一个语言联邦 C++高效编程守则视状况而变化,取决于你使用C++的哪一部分. 条款02:尽量以const.enum.inline替换 #define 对于单纯常量,最好以const对象或enum替换#define 对于形似函数的宏,最好改用inline函数替换#define 条款03:尽可能使用const 将某些东西声明为const可帮助编译器侦测出错误用法.const可被施加于任何作用域内的对象.函数参数.函数返回类型.成员函数本体. 编译器强制实施b…
来源:sjsdfg/effective-java-3rd-chinese <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. (译者)在这里第一时间翻译成中文版.供大家学习分享之用. 本书的源代码见 jbloch/effective-java-3e-source-code. 目录 0…
div { float: left; } .keyboard > div + div { margin-left: 8px; } --> div{display:table-cell;vertical-align:middle}#crayon-theme-info .content *{float:left}#crayon-theme-info .field{font-weight:bold}#crayon-theme-info .field,#crayon-theme-info .value…