effective c++读书笔记(一)】的更多相关文章

Effective STL 读书笔记 标签(空格分隔): 未分类 慎重选择容器类型 标准STL序列容器: vector.string.deque和list(双向列表). 标准STL管理容器: set.multiset.map和multimap. 非标准STL序列容器: slist(单向列表)和rope(重型字符串?). 非标准STL关联容器: hash_set.hash_multiset.hash_map和hash_multimap.(c++11引入了unordered_set.unordere…
Effective STL 读书笔记 本篇文字用于总结在阅读<Effective STL>时的笔记心得,只记录书上描写的,但自己尚未熟练掌握的知识点,不记录通用.常识类的知识点. STL按照容器类型,可以分为标准序列容器(deque,vector,list,string),标准关联容器(map,multimap,set,multiset),另外,还有非标准容器,序列类型有slist和rope,关联类型有hash_**类相关容器.标准关联容器总是保持排列顺序. 在关联容器中,确保关联容器对于所使…
很早之前就听过这本书,找工作之前读一读.看了几页,个人感觉实在是生涩难懂,非常不符合中国人的思维方式.之前也有博主做过笔记,我来补充一些自己的理解. 我看有人记了笔记,还不错:http://www.360doc.com/content/12/0426/20/7899729_206769585.shtml 这位博主还写了more effective c++的读书笔记:http://bellgrade.blog.163.com/blog/static/83155959200863113228254/…
Effective Java是一本经典的书, 很实用的Java进阶读物, 提供了各个方面的best practices. 最近终于做完了Effective Java的读书笔记, 发布出来与大家共享. Background 看了历史, 写第一篇笔记居然是2016年的事情了, 中间半途而废搁置了好长时间, 去年生病的时候捡起来看了一些, 今年终于看完了. 做这个笔记的目的主要是为了个人学习, 把一本书读薄, 也留下以后可以查阅翻阅的资料. 写博客这么多年, 我觉得有一个很大的好处是, 有时候会有一个…
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己 计在16年要看12本书,主要涉及java基础.Spring研究.java并发.JVM.分布式之类的.在今年面试的时候深受打击,到处都是问分布式.集群的?难道现在工作两三年的都这么牛逼了?都在搞分布式.集群之类的? 2016书单如下: 1.深入理解Java虚拟机:JVM高级特性与最佳实践---(已看,预计今年看三遍) 2.Oracle查询优化改写技巧与案例---(已看) 3.Ef…
一本不错的书,给出了52条建议来优化程序的性能,对初学者有不错的指导作用,但是对高级阶段的程序员可能帮助不是很大.这里贴出部分笔记: 第2条: 使用#improt导入头文件会把头文件的内容全部暴露到目标文件中,而且如果两个类之间存在循环引用则会出现编译错误,所以要尽量使用@class进行类声明. 如果需要实现一个协议,则必须#improt这个协议的头文件,所以可以将协议单独定义在一个.h文件当中.如果这个协议是代理模式协议的一部分,即需要与类捆绑使用才有实际意义,则建议定义在类当中,并以类名为前…
C++ 是一个难学易用的语言! [C++为什么难学?] C++的难学,不仅在其广博的语法,以及语法背后的语义,以及语义背后的深层思维,以及深层思维背后的对象模型: C++的难学还在于它提供了四种不同而又相辅相成的编程模型(programming paradigms): procedural-based(基于过程) object-based(基于对象) object-oriented(面向对象) generics(泛型) 在庞大复杂的机制下,万千使用者前仆后继的动力是:一旦学成,妙用无穷! [C+…
这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文<java中final与static的使用场景总结>. 什么是静态工厂方法? 可以参考书中的例子(摘自JDK1.7 java.lang.Boolean) public final class Boolean implements java.io.Serializable, Comparable<…
第一部分 让自己习惯C++ 条款01:视C++为一个语言联邦 一.要点 ■ c++高效编程守则视状况而变化,取决于你使用c++的哪一部分. 二.扩展 将c++视为一个由相关语言组成的联邦而非单一语言会帮助你更好的理解,其由c.object-oriented c++.template c++和stl四部分组成. 条款02:尽量以const,enum,inline替换#defines 一.要点 ■ 对于单纯变量,最好以const对象或enums替换#defines. ■ 对于形似函数的宏,最好改用i…
https://www.cnblogs.com/harlanc/tag/effective%20c%2B%2B/default.html?page=3…
1.视C++为一个语言联邦     C.object-oriented C++.template C++.STL 2.尽可能使用const:     1)关键字const出现的星号左边,表示被指物事常量:如果出现在星号右边,表示指针自身是常量:如果出现在两边,表示被指物和指针都是常量.     2)stl迭代器中申明迭代器为const就像申明指针为const一样,表示这个迭代器不得指向不同的东西,但他所指向的东西的值是可以改动的.如果希望所指的东西不可被改动,你需要的是const  iterat…
Item 22: Prefer Helper Classes Over Bookkeeping with Dictionaries and Tuples For example, say you want to record the grades of a set of students whose names aren't konwn in advance. You can define a class to store the names in a dictionary instead of…
Item 14: Prefer Exceptions to Returning None Functions that returns None to indicate special meaning are error prone because None and other values (e.g., zero, the empty string) all evaluate to False in conditional expressions. Raise exceptions to in…
Item 2: Follow the PEP 8 Style Guide Naming Naming functions, variables, attributes lowercase_underscore protected instance attributes _leading_underscore private instance attributes __double_leading_underscore classes, exceptions CapitalizedWord mod…
创建和销毁对象 >考虑用静态工厂方法替代构造器. 优点: ●优势在于有名称. ●不必再每次调用他们的时候都创建一个新的对象. ●可以返回原返回类型的任何子类型的对象. ●在创建参数化类型实例的时候,他们使代码更加简洁. 缺点: ●类如果不含公有的或者受保护的构造器.就不能被子类化. ●他们与其他的静态方法没有任何区别. >遇到多个构造器参数的时候考虑用构建器. >用私有的构造器或者枚举类型强化Singleton属性. >通过私有构造器强化不可实例化的能力. >避免创建不必要的…
一.谨慎地实现Serializable接口 1.一旦一个类被发布,就大大地降低了“改变这个类的实现”的灵活性. 2.仔细设计类的序列化形式而不是接受类的默认虚拟化形式. 3.反序列化机制是一个“隐藏的构造器”,具备与其他构造器相同的特点. 二.考虑使用自定义的序列化形式 三.保护性地编写readObject方法 1.对于对象引用域必须保持为私有的类,要保护性地拷贝这些域中的每个对象. 2.检查失败要抛出InvalidObjectException异常,检查应该跟在所有的保护性拷贝之后 3.无论直…
一.访问共享的可变数据时要同步 1.synchronized关键字既然保证访问的可见性也能保证原子性.而volatile修饰符只能保证变量的线程可见性. 2.增量操作符等不是原子性,多线程操作时可能导致结果不正确. 3.尽量将可变数据限制在单个线程中. 4.多个线程共享可变的数据时,每个读或者写数据的线程都必须同步. 二.避免过度同步 1.在同步的方法或者代码块中,注意多态等级制引入的客户端的外来输入,要保证其没有破坏同步机制和造成死锁. 2.尽量把对外来方法的调用移动到同步区域之外. 3.在同…
一.只针对异常的情况才使用异常 1.类具有状态相关的方法时,可采用状态测试方法和可识别的返回值两个策略. 二.对可恢复的情况使用受检异常,对编程错误使用运行时异常 1.期望调用者能够适当恢复的情况,应该使用受检的异常. 2.用运行时异常来表明编程错误. 三.编码不必要地使用受检异常 1.使用受检异常的两个条件: a.正确地使用API并不能阻止这种异常条件的发生 b.异常发生后,使用API的程序员可以立即采取有用的动作. 四.优先使用标准的异常 1.IllegalArgumentException…
一.将局部变量的作用域最小化 1.在第一次使用变量的地方声明 2.几乎每个变量的声明都应该包含一个初始化表达式:try-catch语句是一个例外 3.使方法小而集中是一个好的策略 二.for-each循环优先于传统的for循环 1.for-each循环在简洁性和预防bug方面有着传统的for循环无法比拟的优势,而且没有性能损失. 2.三种不能使用for-each循环的情况: a.过滤:需要显式的迭代器的remove方法 b.转换:需要显式的迭代器或数组索引,以便设定值 c.平行迭代:多个相关集合…
一.检查参数的有效性 1.考虑参数有哪些限制,把限制写到文档中,在方法的开头处通过显式地检查来实施这些限制. 二.必要时进行保护性拷贝 1.如果类具有从客户端得到或者返回的可变组件,类就必须考虑保护性拷贝这些组件. 2.如果拷贝成本比较高,类又可以信任他的客户端,不进行拷贝保护,但要进行文档的说明. 三.谨慎设计方法签名 1.谨慎地选择方法的名称:遵守规范,保持风格一致. 2.不要过于追求提供便利的方法. 3.编码过长的参数列表 a.一个方法分解成多个方法 b.创建辅助类,保存参数的分组. c.…
Java1.5中引入了两个新的应用类型家族,新的类为枚举类型,新的接口为注解类型. 一.用enum代替int常量 1.枚举值由一组固定的常量组成合法值的类型. 二.用实例域代替序数 1.不要根据枚举的序数导出它关联的值,而是把它保存在一个实例域中. 三.用EnumSet代替位域模式 1.如果有枚举类型需要用在集合中,EnumSet就是最好的工具. 四.用EnumMap代替序数索引功能 1.EnumMap更加安全和可靠. 五.用接口模拟实现可伸缩的枚举 1.可伸缩的枚举类型,一般不是一个好主意.…
泛型的本质是参数化类型.只对编译器有效. 一.请不要在新代码中使用原生态类型 1.泛型类和接口统称为泛型,有一个对应的原生态类型. 2.原生类型的存在是为了移植兼容性. 3.无限制通配类型和原生态类型的区别是:通配符类型是安全的,原生态类型不安全.你可以将任何元素放入到原生态类型的集合中,但不能将除了null之外的其他任何元素放到Collection<?>中. 4.两条例外: a.在Class中只能使用原生态类型,因为泛型信息可以在运行时被擦除. b.在操作instanceof时,使用参数化类…
一.使类和成员的可访问性最小化 1.尽可能地使每个类或者成员不被外界访问. 2.实例域决不能是共有的.包含公有可变域的类不是线程安全的. 3.除了公有静态final域的特殊情形之外,公有类都不应该包含公有域,并且确保公有静态final域所引用的对象不可变. 二.在公有类中使用访问方法而非公有域 1.如果类是包级私有的,或者是私有的嵌套类,直接暴露它的数据域并没有本质的错误. 2.公有类永远都不应该暴露可变的域. 三.使可变性最小化 不可变的类是指其实例不能被修改的类.为使类不可变,需要遵循以下五…
尽管Object是一个具体的类,但设计它主要是为了扩展.它的所有非final方法都有明确的通用约定.任何一个类在override时,必须遵守这些通用约定. 一.覆盖equals时请遵守通用的约定 1.Object中默认的equals方法约定是:类的每个实例都只与它自身相等.当类有自己特有的“逻辑相等”的概念时,就应该覆盖equals方法. 2.Timestamp对Date进行了扩展,Timestamp的equals实现确实违反了对称性.如果Timestamp和Date混合一起使用,可能导致不正确…
一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: 1.静态工厂方法有名称:通过有意义的静态工厂方法名称可以很好的表达工厂方法的作用,易于区别功能相似的多个静态工厂方法. 2.静态工厂方法可以有更复杂的生产对象逻辑,不仅仅是新建一个对象:既可以新建一个对象,也可以使用缓存的对象. 3.静态工厂方法可以返回原返回类型的任何子类型的对象:由于接口不能有…
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3575599.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验. 第2条:在类的头文件中尽量少引入头文件 1. 常规情况: 在.h文件中:(写在@interface之前) @class SomeClass; 在.m文件中: #import "SomeClass.h" 2. 必须在.h中引入头文件的情况: 类继承某个超类 类实现某个协议 第3条:尽量使…
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537576.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验. 第1条:用静态工厂代替构造函数 1. 形式 public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 2. 优点: 可以有名称 不一定要创建新对象,可以返回已有的对象 可以返回子类类…
第21条:用函数对象表示策略 这一条其实也没说啥,就是策略模式.碰到这种场景时,定义一个策略接口,然后不同策略子类实现它,主类包含这个接口的引用就可以了. 第22条:优先考虑静态成员类 嵌套类是指被定义在另一个类的内部的类.嵌套类存在的目的应该只是为它的外围类提供服务.嵌套类包括四种:静态成员类.非静态成员类.匿名类和局部类.除了第一种之外,其他三种都被称为内部类. 听起来很绕,其实区分还是很简单的. 首先,如果没有放在方法内部,那就是成员类(根据具体情况决定要不要做成静态的).放在方法内部,那…
第19条:接口只用于定义类型 这一条就举了一个反例,说有些接口中只包含常量.这是对接口的不良使用.要实现相同的功能,应该使用不可实例化的工具类(第4条说过). public class PhysicalConstants { private PhysicalConstants() { } // Prevents instantiation // Avogadro's number (1/mol) public static final double AVOGADROS_NUMBER = 6.02…
第17条:要么为继承而设计,并提供文档说明,要么就禁止继承 第18条:接口优于抽象类 这两条中,提到了一个很重要的概念骨架实现.也就是说,抽象类实现接口的形式.这样的好处是,接口本来不能提供默认的实现,现在可以在抽象类中实现一些关键的方法.结合了接口和抽象类的优点.例如AbstractCollection,就是一个骨架实现. 另外,在查看源码的过程中,发现居然接口中也可以有方法体了.查了一下,原来是java8的新特性,用default关键字. public interface Collectio…