- 博客(124)
- 资源 (4)
- 收藏
- 关注
原创 Item 54:熟悉一下标准库,比如TR1
Item 54: Familiarize yourself with the standard library, including TR1.C++这个名字是在1983年由Rick Mascitti提出的,C++的曾用名还有”new C”, “C with Classes”。 1998年ISO/IEC 14882发布了第一个C++标准,就是我们常讲的C++98。后续的标准还包括C++03,C++T...
2016-02-20 20:23:48 1871 1
原创 Item 53:注意编译警告
Item 53: Pay attention to compiler warnings.编译警告在C++中很重要,因为它可能是个错误啊! 不要随便忽略那些警告,因为编译器的作者比你更清楚那些代码在干什么。 所以,请严肃对待所有warning,要追求最高warning级别的warning-free代码;但不要依赖于warning,可能换个编译器有些warning就不在了。
2016-02-20 20:23:15 1655 1
原创 Item 52:写了placement new就要写placement delete
Item 52: Write placement delete if you write placement new“placement new”通常是专指指定了位置的new(std::size_t size, void *mem),用于vector申请capacity剩余的可用内存。 但广义的”placement new”指的是拥有额外参数的operator new。new和delete是要成对...
2016-02-20 20:22:45 1600 1
原创 Item 51:写new和delete时请遵循惯例
Item 51: Adhere to convention when writing new and delete.Item 50介绍了如何自定义new和delete但没有解释你必须遵循的惯例, 这些惯例中有些并不直观,所以你需要记住它们!operator new需要无限循环地获取资源,如果没能获取则调用”new handler”,不存在”new handler”时应该
2016-02-20 20:22:11 1519 3
原创 Item 50:为什么需要自定义new和delete?
Item 50: Understand when it makes sense to replace new and delete.我们在Item 49中介绍了如何自定义new的错误处理函数,以及如何为你的类重载operator new。 现在我们回到更基础的问题,为什么我们需要自定义operator new或operator delete?检测使用错误。new得到
2016-02-20 20:21:26 1604 2
原创 Item 49:new handler的行为
Item 49: Understand the behavior of the new-handler.new申请内存失败时会抛出"bad alloc"异常,此前会调用一个由std::set_new_handler()指定的错误处理函数(”new-handler”)。set_new_handler()“new-handler”函数通过std::set_new_handler()来设
2016-02-19 12:02:05 1053 1
原创 Item 48:了解模板元编程
Item 48: Be aware of template metaprogramming.模板元编程(Template Metaprogramming,TMP)就是利用模板来编写那些在编译时运行的C++程序。 模板元程序(Template Metaprogram)是由C++写成的,运行在编译器中的程序。当程序运行结束后,它的输出仍然会正常地编译。C++并不是为模板元编程设计的,但自90年代以来,...
2016-02-19 12:01:18 1449 1
原创 Item 47:使用Traits类提供类型信息
Item 47: Use traits classes for information about types.C++中的 Traits 类可以在编译期提供类型信息,它是用Traits模板及其特化来实现的。 通过方法的重载,可以在编译期对类型进行”if…else”判断。我们通过STL中的一个例子来介绍Traits的实现和使用。本文以iterator_traits为例介绍了如何实
2016-02-19 12:00:20 1590 1
原创 Item 46:需要类型转换时,应当在类模板中定义非成员函数
Item 46: Define non-member functions inside templates when type conversions are desired.Item 24中提到,如果所有参数都需要隐式类型转换,该函数应当声明为非成员函数。 Item 24是以Rational和operator*为例子展开的,本文把这个观点推广到类模板和函数模板。 但是在类模板
2016-02-19 11:52:59 1277 1
原创 Item 45:使用成员函数模板来接受所有兼容的类型
Item 45: Use member function templates to accept “all compatible types”.Item 13提到智能指针可用来自动释放堆中的内存,STL中的迭代器也是一种智能指针,它甚至支持链表元素指针的++操作。 这些高级特性是普通指针所没有的。本文以智能指针为例,介绍成员函数模板的使用:成员函数模板可以使得函数可以接受所有兼容的
2016-02-19 11:49:39 1121
原创 Item 44:将参数无关代码重构到模板外去
Item 44: Factor parameter-independent code out of templates.模板是个好东西,你可以在实现类型安全的同时少写很多代码。但模板提供的是编译期的多态, 即使你的代码看起来非常简洁短小,生成的二进制文件也可能包含大量的冗余代码。 因为模板每次实例化都会生成一个完整的副本,所以其中与模板参数无关的部分会造成代码膨胀(code bloat)。把模板中...
2016-02-19 11:37:33 1127
原创 CSS选择符总结
我们知道CSS是由选择符和属性/值列表构成的,选择符的重要性自然不言而喻。 作为前端开发者选择符想必不是问题,然而前几天面试还真问到了~和+是干吗用的! 长时间不用的选择符自然就会忘了,来总结一下吧!万维网联盟在 HTML 4.0 之外提出层叠样式表(CSS),使用CSS完成样式与内容的分离。层叠样式表(Cascading Style Sheets,CSS), 又称串样式列表、层次结构
2015-10-22 16:15:23 748
原创 Item 43:访问模板基类中的名称 Effective C++笔记
Item 43: Know how to access names in templatized base classes.从面相对象C++转移到模板C++时,你会发现类继承在某些场合不在好使了。 比如父类模板中的名称对子类模板不是直接可见的,需要通过this->前缀、using或显式地特化模板父类来访问父类中的名称。因为父类模板在实例化之前其中的名称是否存在确实是不确定的,而
2015-10-21 13:55:23 899
原创 Item 42:typename的两种用法 Effective C++笔记
Item 42: Understand the two meanings of typename.时至今日还有人在论坛里问模板参数前的typename和class有何区别:templatetypename T> class Widget;templateclass T> class Widget;答案是没有区别!有人觉得class写起来方便就用class,有人觉
2015-10-20 13:19:18 1471
原创 Item 41:隐式接口与编译期多态 Effective C++笔记
Item 41: Understand implicit interfaces and compile-time polymorphism.面向对象设计中的类(class)考虑的是显式接口(explicit interface)和运行时多态, 而模板编程中的模板(template)考虑的是隐式接口(implicit interface)和编译期多态。对类而言,显式接口是由函数签名表征的,运行时多态...
2015-10-18 07:41:37 912 1
原创 Item 40:明智地使用多继承 Effective C++笔记
Item 40: Use multiple inheritance judiciously.多继承(Multiple Inheritance,MI)是C++特有的概念,在是否应使用多继承的问题上始终争论不断。一派认为单继承(Single Inheritance,SI)是好的,所以多继承更好; 另一派认为多继承带来的麻烦更多,应该避免多继承。本文的目的便是了解这两派的视角。具体从如下三个
2015-10-14 12:58:44 764
原创 Item 39:明智地使用private继承 Effective C++笔记
Item 39: Use private inheritance judiciously.Item 32提出public继承表示"is-a"的关系,这是因为编译器会在需要的时候将子类对象隐式转换为父类对象。 然而private继承则不然:class Person { ... };class Student: private Person { ... }; // inh
2015-10-13 22:33:00 920 1
原创 Item 38:通过组合表示"拥有"或"以...实现"的关系 Effective C++笔记
Item 38: Model "has-a" or "is-implemented-in-terms-of" through composition.一个类型包含另一个类型的对象时,我们这两个类型之间是组合关系。组合是比继承更加灵活的软件复用方法。 Item 32提到public继承的语义是"is-a"的关系。对象组合也同样拥有它的语义:就对象关系来讲,组合意味着一个对象拥
2015-09-30 12:35:13 702
原创 Item 37:不要重写父类函数的默认参数
Item 37: Never redefine a function's inherited default parameter value.不要重写父类函数的默认参数。Item 36已经说明子类中不应该重写继承而来的父类的非虚函数。 那么本文讨论的内容其实是:不要重定义虚函数的默认参数。为什么呢? 因为虽然虚函数的是动态绑定的,但默认参数是静态绑定的。只有动态绑定的东西才应该被重
2015-09-29 11:30:30 1774 2
原创 Item 36:不要重写继承来的非虚函数
Item 36: Never redefine an inherited non-virtual function.我们还是在讨论public继承,比如Derived继承自Base。如果Base有一个非虚函数func,那么客户会倾向认为下面两种调用结果是一样的:Derived d;Base* pb = &d;Derived* pd = &d;// 以下两种调用应当等效p
2015-09-28 11:35:35 1877
原创 Item 35:考虑虚函数的其他替代设计 Effective C++笔记
Item 35: Consider alternatives to virtual functions.比如你在开发一个游戏,每个角色都有一个healthValue()方法。很显然你应该把它声明为虚函数,可以提供默认的实现,让子类去自定义它。 这个设计方式太显然了你都不会考虑其他的设计方法。但有时确实存在更好的,本节便来举几个替代的所涉及方法。非虚接口范式(NVI idio
2015-09-25 11:23:35 1142
原创 Item 34:区分接口继承和实现继承 Effective C++笔记
Item 34: Dirrerentiate between inheritance of interface and inheritance of implementation.不同于Objective C或者Java,C++中的继承接口和实现继承是同一个语法过程。 当你public继承一个类时,接口是一定会被继承的(见Item32),你可以选择子类是否应当继承实现:不继承实
2015-09-23 11:04:22 756
原创 Item 33:避免隐藏继承来的名称(继承与作用域嵌套) Effective C++笔记
Item 33: Avoid hiding inherited names.其实本文的话题和继承完全没有关系,隐藏名称是作用域的问题。 在C++中每一对{ }都会开启一个新的作用域,并嵌套在当前作用域中。一个示例int x;void func(){ double x; cin>>x; // read a new value for local
2015-09-22 10:09:20 1790 2
原创 Item 32:确保public继承是"is a"的关系 Effective C++笔记
Item 32: Make sure public inheritance models "is-a".C++面向对象程序设计中,最重要的规则便是:public继承应当是"is-a"的关系。当Derived public继承自Base时, 相当于你告诉编译器和所有看到你代码的人:Base是Derived的抽象,Derived就是一个Base,任何时候Derived都可以代替Base
2015-09-21 12:27:30 692
原创 Item 31:最小化文件之间的编译依赖 Effective C++笔记
Item 31: Minimize compilation dependencies between files.曾听老师讲过,每天上班的第一件事就是下载最新代码开始编译,然后可以有半个小时去喝杯咖啡。。。 这是C++特殊的一点,即使你在保持接口不变的情况下只改了类的内部实现,其他的项目文件仍然可能需要重新编译。C++的Class不仅规约了外部接口,也给出了内部实现:c
2015-09-19 11:56:03 1211
原创 Item 30:理解inline函数的里里外外 Effective C++笔记
Item 30: Understanding the ins and outs of lining.inline(内联)函数的好处太多了:它没有宏的那些缺点,见Item 2:避免使用define;而且不需要付出函数调用的代价。 同时也方便了编译器基于上下文的优化。但inline函数也并非免费的午餐:它会使得目标代码膨胀,运行时会占用更多的内存,甚至引起缓存页的失效和指令缓存的M
2015-09-18 11:50:47 823
原创 Item 29:追求异常安全的代码 Effective C++笔记
Item 29: Strive for exception-safe code.异常安全是指当异常发生时,1) 不会泄漏资源,2) 也不会使系统处于不一致的状态。 通常有三个异常安全级别:基本保证、强烈保证、不抛异常(nothrow)保证。基本保证。抛出异常后,对象仍然处于合法(valid)的状态。但不确定处于哪个状态。强烈保证。如果抛出了异常,程序的状态没有发生任何改变。就像
2015-09-17 12:40:27 836
原创 Item 28:不要返回对象内部的句柄 Effective C++笔记
Item 28: Avoid returning "handles" to object internals.不要返回对象私有成员的句柄。这里的“句柄”(handle)包括引用、指针和迭代器。 这样可以增加类的封装性、使得const函数更加const, 也避免了空引用的创建(dangling handles)。为了方便起见,下文中统一用指针来称呼这三类句柄。返回
2015-09-16 10:18:49 847
原创 Item 27:最小化类型转换 Effective C++笔记
Item 27: Minimize casting.C++的类型检查只在编译时执行,运行时没有类型错误的概念。 理论上讲只要你的代码可以编译那么就运行时就不会有不安全的操作发生。 但C++允许类型转换,也正是类型转换破坏了理论上的类型系统。在C#,Java等语言中类型转换会更加必要和频繁,但它们总是安全的。C++则不然, 这要求我们在类型转换时格外小心。C++中的类型转换有三种
2015-09-15 11:27:48 764
原创 Item 26:为什么要推迟变量的定义? Effective C++笔记
Item 26: Postpone variable definitions as long as possible.这一规则在任何编程语言中都适用,一方面可以避免无用的构造使得程序更高效,另一方面作用域的缩小会使程序更加清晰。 存在控制流转移的代码中,你可能会不经意间定义无用的变量。例如:string encryptPassword(const string& passwor
2015-09-12 11:04:20 1792 2
原创 Item 25:考虑实现一个不抛异常的swap Effective C++笔记
Item 25: Consider support for a non-throwing swap.Swap函数最初由STL引入,已经成为异常安全编程(见Item 29)的关键函数, 同时也是解决自赋值问题(参见Item 11:赋值运算符的自赋值问题)的通用机制。 std中它的基本实现是很直观的:namespace std{ templatetypename T>
2015-09-11 12:54:40 2008 3
原创 Item 24:用非成员函数来支持所有元的类型转换 Effective C++笔记
Item 24: Declare non-member functions when type conversions should apply to all parameters.虽然Item 15:资源管理类需要提供对原始资源的访问中提到,最好不要提供隐式的类型转化。 但这条规则也存在特例,比如当我们需要创建数字类型的类时。正如double和int能够自由地隐式转换一样,
2015-09-10 05:12:24 766
原创 JavaScript显式类型转换与隐式类型转换
本文谈谈JavaScript的类型转换,我们知道在JavaScript中声明变量不需指定类型, 对变量赋值也没有类型检查,同时JavaScript允许隐式类型转换。这些特征说明JavaScript属于弱类型的语言。在强类型的C++中,多数情况下构造函数需要声明为explicit来避免隐式类型转换引起的误用 (见Item 15:资源管理类需要提供对原始资源的访问)。 弱类型的语言中类
2015-09-08 04:38:34 13490 1
原创 Item 23:非成员非友元函数好于成员函数 Effective C++笔记
Item 23: Prefer non-member non-friend functions to member functions在类的是实现中,常常会面临成员函数和非成员函数的选择。比如一个浏览器类:class WebBrowser{public: void clearCache(); void clearCookies(); void clearHisto
2015-09-07 14:19:46 1116 2
原创 Item 22:数据成员应声明为私有 Effective C++笔记
Item 22: Declare data members private数据成员声明为私有可以提供一致的接口语法,提供细粒度的访问控制,易于维护类的不变式,同时可以让作者的实现更加灵活。而且我们会看到,protected并不比public更加利于封装。语法一致性你肯定也遇到过这种困惑,是否应该加括号呢?obj.length // 还是 obj.length(
2015-09-06 16:30:30 943 1
原创 Item 21:需要返回对象时,不要返回引用 Effective C++笔记
Item 21: Don't try to return a reference when you must return an objectItem 20中提到,多数情况下传引用比传值更好。追求这一点是好的,但千万别返回空的引用或指针。 一个典型的场景如下:class Rational{ int n, d;public: Raitonal(int numerator
2015-09-06 08:37:57 1814 1
原创 escape, encodeURI, encodeURIComponent的区别
我们知道在Web前端存在多种类型的编码,比如URL中的%xxx、图片src的data:ZmRy...等。 这些编码和解码过程会用到不同的编解码函数,本文来介绍不同编码的编码方式以及使用场景。escapeescape对应的解码函数是unescape,它们已经从Web标准中废弃。绝大多数情况都可以使用encodeURI和encodeURIComponent来代替。escap
2015-09-05 14:50:45 810 1
原创 HTML5本地存储:SessionStorage, LocalStorage, Cookie
SessionStorage, LocalStorage, Cookie这三者都可以被用来在浏览器端存储数据,而且都是字符串类型的键值对!。 区别在于前两者属于WebStorage,创建它们的目的便是存储客户端数据。 而Cookie早在网景公司的浏览器中就开始支持,最初目的是为了保持HTTP的状态。概念的异同Cookie是存储在客户端的小型文本文件,可以包含若干键值对,每个键值对可
2015-09-04 12:33:24 3454 2
原创 如何理解HTTP响应的状态码?
我们知道HTTP协议是通过HTTP请求和HTTP响应来实现双向通信的。 HTTP状态码(HTTP Status Code)是用以表示Web服务器HTTP响应状态的3位数字代码,由RFC 2616规范定义。 合理的状态码不仅可以让用户或者浏览器做出更加合适的进一步操作,而且可以让客户端代码更加易于理解和维护。HTTP状态码分为5类:1xx表示继续发送请求;2xx表示请求成功;3xx表示资源已
2015-09-03 12:52:26 12131
原创 事件处理中的this:attachEvent, addEventListener, onclick
事件处理函数中,我们通常使用this来获取当前被操作的对象。这无疑是很方便的一个特性, 但对于不同的事件绑定方式,this可能不一定是当前被操作的对象。 本文便来分析不同的方式绑定事件处理函数时,函数中this的区别。常见的事件绑定方式不外乎4种:attachEvent:IE9以下的MSIE中。addEventListener:支持DOM Level 2 Event的浏览器中。
2015-09-02 14:11:50 851
C/C++ 语言参考
2011-03-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人