- 博客(83)
- 资源 (4)
- 收藏
- 关注
原创 Item 19:把类的设计视作类型设计 Effective C++笔记
Item 19: Teat class design as type design.在面向对象语言中,开发者的大部分时间都用在了增强你的类型系统。这意味着你不仅是类的设计者,更是类型设计者。 重载函数和运算符、控制内存分配和释放、定义初始化和销毁操作……良好的类型有着自然的语法、直观的语义,以及高效的实现。 你在定义类时需要像一个语言设计者一样地小心才行!类的设计就是类型设计,
2015-08-31 18:20:28 826
原创 减少页面回流与重绘(Reflow & Repaint)
如果你的HTML变得很大很复杂,那么影响你JavaScript性能的可能并不是JavaScript代码的复杂度,而是页面的回流和重绘。回流(Reflow)是指布局引擎为frame计算图形的过程。 frame是一个矩形,拥有宽高和相对父容器的偏移。frame用来显示盒模型(content model), 但一个content model可能会显示为多个frame,比如换行的文本每行都会显示为
2015-08-31 09:38:59 4821 3
原创 Cookie/Session的机制与安全
Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道。本文来详细讨论Cookie和Session的实现机制,以及其中涉及的安全问题。因为HTTP协议是无状态的,即每次用户请求到达服务器时,HTTP服务器并不知道这个用户是谁、是否登录过等。现在的服务器之所以知道我们是否已经登录,是因为服务器在登录时设置了浏览器的Cookie!S
2015-08-29 12:10:52 2677 2
原创 Item 18:让接口容易被正确使用,不易被误用 Effective C++笔记
Item 18: Make interfaces easy to use correctly and hard to use incorrectly.“让接口容易被正确使用,不易被误用”,这也是面向对象设计中的重要概念,好的接口在工程实践中尤其重要。 在使用优秀的第三方组件时,常常能够切身感受到好的接口原来可以这么方便,甚至不需记住它的名字和参数就能正确地调用。 反观自己写的API,常
2015-08-29 12:10:06 852
原创 Item 17:在单独的语句中将new的对象放入智能指针 Effective C++笔记
Item 17: Store newed objects in smart pointers in standalone statements.在单独的语句中将new的对象放入智能指针,这是为了由于其他表达式抛出异常而导致的资源泄漏。 因为C++不同于其他语言,函数参数的计算顺序很大程度上决定于编译器。如果你在做Windows程序设计,或者DLL开发,可能会经常碰到类似__cd
2015-08-28 16:22:49 806
原创 Item 16:为什么要使用同样的形式来new和delete Effective C++笔记
Item 16: Use the same form in correspoinding uses of new and delete.这是C++界中家喻户晓的规则:如果你用new申请了内存,请用delete来销毁;如果你用new xx[]申请了内存,请用delete[]来销毁。 不必多说了,来个例子吧:int* p = new int[2]{11, 22};prin
2015-08-28 11:58:46 804
原创 jQuery中$()函数的用法小结
jQuery想必是当前前端开发中必不可少的组件。它提供了DOM对象的封装、统一的事件机制、以及一系列的工具函数。 由于面试中突然被问及jQuery中$()有几种用法,瞬间有点懵并未答全。 虽说这样的问法颇似孔乙己问“茴香豆的茴有几种写法?”,但还是借此机会来整理知识,伺机学习一把!首先我们需要引入jQuery,如果你还没有听过jQuery,请移步其他文章或者在你的网站中引入这个:
2015-08-28 11:55:29 6291 2
原创 Item 15:资源管理类需要提供对原始资源的访问 Effective C++笔记
Item 15: Provide access to raw resources in resource-managing classes.在一个完美的设计中,所有的资源访问都应通过资源管理对象来进行,资源泄漏被完美地克服。然而世界是不完美的, 很多API会直接操作资源,尤其是一些C语言的API。总之,你会时不时地发现有需要直接访问资源, 所以资源管理对象需要提供对原始资源访问。获取资
2015-08-27 10:59:54 1073 2
原创 Item 14:资源管理类要特别注意拷贝行为 Effective C++笔记
Item 14: Think carefully about copying behavior in resource-managing classes.在Item 13:使用对象来管理资源中提出了基于RAII的资源管理对象,auto_ptr和shared_ptr。 智能指针可以有不同的拷贝策略。当你实现这样一个资源管理对象时,需要特别注意。比如一个典型的RAII风格的互斥锁实现:
2015-08-27 09:37:34 1152
原创 表单提交:button input submit 的区别
最近项目代码中的表单提交的方式已经百花齐放了,现在用这篇文章来整理一下不同表单提交方式的区别,给出最佳实践。先给结论:建议使用button[type=submit]来提交表单,而不是input;只有单行文本控件时,回车会引发表单提交;通过onsubmit事件可阻止表单提交。input[type=submit]这是最常见的提交方式。不多说了,看图:图中可以看到
2015-08-27 00:52:15 8590 3
原创 Item 13:使用对象(智能指针)来管理资源 Effective C++笔记
Item 13: Use objects to manage resources.熟悉智能指针的人肯定不会对此觉得陌生。利用C++中对象自动析构的特性,自动地释放资源。 C++编译器并未提供自动的垃圾回收机制,因此释放资源的责任落在了开发者的头上。 我们被要求总是成对地使用new和delete,例如:Investment *pInv = createInvestment();
2015-08-26 12:11:55 938 1
原创 Item 12:完整地拷贝对象(拷贝构造函数、复制运算符) Effective C++笔记
Item 12: Copy all parts of an object在一个成熟的面向对象的C++系统中,只有两种拷贝对象的方式:复制构造函数和赋值运算符, 不妨称他们为拷贝函数。 拷贝函数属于编译器默认生成的函数(参考:Item 5:那些被C++默默地声明和调用的函数), 默认的拷贝函数确实会完整地拷贝对象,但有时我们选择重载拷贝函数,问题就出在这里!一个正确拷贝函数的
2015-08-26 12:10:43 1097 1
原创 DOM Level 2 Event与jQuery源码:捕获与冒泡
本文中的JavaScript事件是指:在浏览器中,DOM标准提供的JavaScript事件集与接口集。在项目开发中通常会使用类似jQuery的工具来绑定事件处理函数, 也可以设置捕获,或者中断事件流,正如这篇文章锁讨论的: jQuery事件:bind、delegate、on的行为与性能。 本文来讨论DOM标准中是如何规定这些JavaScript事件的,以及jQuery源码中DOM事
2015-08-25 23:36:43 3347 2
原创 Item 11:赋值运算符的自赋值问题 Effective C++笔记
Item 11: Handle assignment to self in operator=如果我们选择重载一个类的赋值运算符,要注意在自赋值时仍然能够正确工作。自赋值看起来像是不正确的调用方式, 但是在C++中这是合法的而且常常是不可识别的。例如:a[i] = a[j];*p1 = *p2;base = derived 之所以会出现自赋值的问题,是因为C+
2015-08-25 23:36:09 1071
原创 Item 10:赋值运算符要返回自己的引用 Effective C++笔记
Item 10:Have assignment operators return a reference to *this.这是关于赋值运算符的编程惯例,用来支持链式的赋值语句:int x, y, z;...x = y = z = 1;在C++中,它相当于:x = ( y = ( z = 1 ) );这是因为=运算符是右结合的,链式赋值时
2015-08-25 16:05:59 927
原创 Item 9:在析构/构造时不要调用虚函数 Effective C++笔记
Item 9: Never call virtual functions during construction or destruction.父类构造期间,对虚函数的调用不会下降至子类。如果这并非你的意图,请不要这样做! 这个问题阿里实习面试曾经问到过,看这篇文章: 2014阿里巴巴面试经历看Scott Meyers举的例子:class Transaction {
2015-08-25 16:05:13 815
原创 Item 8:析构函数不要抛出异常 Effective C++笔记
Item 8: Prevent exceptions from leaving destructors.析构函数不要抛出异常由于析构函数常常被自动调用,在析构函数中抛出的异常往往会难以捕获,引发程序非正常退出或未定义行为。 例如,对象数组被析构时,会抛出多于一个的异常,然而同时存在的异常在C++标准中是禁止的, 因此程序会非正常退出:class Widget {publi
2015-08-24 13:20:06 912
原创 博客迁移:Shell脚本批量文件处理
近期我对所有文章链接(permalink)进行了重新设计, 为了使得旧链接仍可访问,需要把所有旧的URL重定向到新的URL。 因为本博客由Github Pages提供服务,HTTP服务器和域名均不可配置,只能通过旧的HTML重定向到新的HTML。 于是我需要为所有文章创建一个HTML文件用于重定向。HTML提供了一种301重定向的方式: http-equiv="refresh" c
2015-08-24 13:19:30 1753
原创 Item 7:将多态基类的析构函数声明为虚函数 Effective C++笔记
虚析构函数Item 7: Declare destructors virtual in polymorphic base classes析构函数声明为虚函数恐怕是面试中最常见的问题之一。目的在于以基类指针调用析构函数时能够正确地析构子类部分的内存。 否则子类部分的内存将会泄漏,正确的用法如下:// 基类class TimeKeeper{public: virtual ~TimeKeep...
2015-08-24 13:18:54 780
原创 Item 6:禁用那些不需要的缺省方法 Effective C++笔记
Item 6: Explicitly disallow the use of compiler-generated functions you do not want.在C++中,编译器会自动生成一些你没有显式定义的函数,它们包括:构造函数、析构函数、复制构造函数、=运算符。 关于这些函数是的调用时机可以参考:那些被C++默默地声明和调用的函数。这些默认生成的函数给我们的类
2015-08-24 13:18:24 885
原创 Item 5:那些被C++默默地声明和调用的函数 Effective C++笔记
Item 5: Know what functions C++ silently writes and calls在C++中,编译器会自动生成一些你没有显式定义的函数,它们包括:构造函数、析构函数、复制构造函数、=运算符。 有时为了符合既有设计,我们不希望自动生成这些函数,我们可以把它们显式声明为private。 此时在使用这些类的客户看来,它们就像不存在一样。clas
2015-08-24 13:17:30 893
原创 进程的地址空间:TEXT,DATA,BSS,HEAP,STACK
现代操作系统对每个进程都分配了完整的虚拟内存地址空间。进程会把整个地址空间分成多个区间来使用。 程序员最为熟悉的两个区间莫过于堆和栈。然而还有其他的内存区间来存储代码、静态、全局变量等等。 本文来总结一下这些内存区间到底存的是哪些东西。先看图: 图片来源: SWAT Blog虚拟内存技术使得每个进程都可以独占整个内存空间,地址从零开始,直到内存上限。 每个进程都将这部分空间(从
2015-08-23 22:43:43 2127
原创 Item 4:确保变量的初始化 Effective C++笔记
Item 4: Make sure that objects are initialized before they're used. 在使用对象前确保其已经初始化。出于效率原因,C++不保证非成员对象的内置型的初始化。对于成员变量的内置类型, 会在构造函数进入之前进行初始化。例如:class C(){ int a; B b;};这里的a和b都是
2015-08-21 17:48:12 789
原创 Item 3:尽量使用常量 Effective C++笔记
Item 3: Use const whenever possible尽量使用常量。不需多说,这是防卫型(defensive)程序设计的原则, 尽量使用常量限定符,从而防止客户错误地使用你的代码。常量的声明总结一下各种指针的声明方式吧:char greeting[] = "Hello";char *p = greeting;
2015-08-20 13:55:50 784
原创 Item 2:避免使用define Effective C++笔记
Item 2: Prefer consts, enums, and inlines to #defines尽量使用常量、枚举和内联函数,代替#define。我们知道#define定义的宏会在编译时进行替换,属于模块化程序设计的概念。 宏是全局的,面向对象程序设计中破坏了封装。因此在C++中尽量避免它!接着我们具体来看#define造成的问题。不易理解众所周知
2015-08-20 13:55:18 958
原创 Item 1:将C++视作一系列的语言 Effective C++笔记
Item 1: View C++ as a federation of languages最初,C++只是C语言加上一些面向对象的特性,所以C++的原名是“C with Classes”。 现在的C++已经逐渐成熟,成为一门多范式的程序设计语言(multiparadigm programming language)。同时支持过程式、面向对象、函数式、泛型编程,以及元编程。C++
2015-08-20 13:54:40 1141
原创 在VIM下写C++能有多爽?
我是坚定的Vim党,因为和命令行的集成如此之好,Vim可以解决任何问题。 然而在这个世界上,即便是最好用的工具也是需要配置的。本文就来打造一个适合写C++的Vim编辑器!基础设置稍微熟悉Vim的小伙伴都会知道这个文件~/.vimrc,如同绝大多数的Unix软件,Vim也是用基于文本的配置文件。 当前用户的Vim配置便存储在这个文件当中,该文件的每一行便是一个配置项(function除外)。配置文件...
2015-08-20 13:53:48 26202 3
原创 感受Vim的强大:进阶技巧
Vim是从vi发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器。文档参见:http://vimdoc.sourceforge.net/htmldoc/中文文档:http://vimcdoc.sourceforge.net/doc/块编辑可视 模式:v 可进入vi
2015-08-20 13:52:53 5553
原创 CSS规则的优先级匹配
CSS规则之间可以互相覆盖,这一点我们应该已经习以为常了。然而正是由于规则之间可以互相覆盖、子元素继承父元素的默认行为,导致了CSS冲突的问题。 碰到CSS冲突时,通常我们会加入一些更加详细的规则来明确如何显示,以此解决冲突。通常越详细的规则优先级会越高,但优先级究竟是如何定义的呢?首先根据CSS定义位置来区别,优先级从低到高如下:浏览器默认样式(Browser Default S
2015-08-19 11:06:33 1639
原创 C++手稿:函数与参数
默认参数在函数声明中可以设置若干个默认参数,这些参数在函数调用时可以省略。例如:void print(int a = 3, int b=4){ couta" "bendl;}print(); // 3 4print(4); // 4 4print(,3); // compile error默认参数提供了更灵活的函数声明。简化函数逻辑的同时,也提供了一
2015-08-19 11:05:58 650
原创 C++手稿:指针与引用
引用引用是C++的C语言的扩充,用来定义一个变量的别名。其使用方式同被引用的变量,且可以通过参数传递引用。 引用在定义时必须初始化为一个变量,初始化为常量或表达式都会引发编译错误。引用是一种隐式的指针,对它的操作都会被解释为对它引用的对象的操作。 引用不占用栈空间,因为编译器知道它的地址。但作为参数传递引用时,会把指针放在参数栈中。例如:void function(int&
2015-08-19 11:05:31 712
原创 C++手稿:STL中的函数对象与函数指针
先来感受一下C++中的函数对象和函数指针:templatetypename T>void printer(int a, int b, T func){ coutfunc(a, b)endl;}在STL中定义了很多像上面这样的模板,这里的T是一个可调用(实现了括号运算符)的东西。 这使得我们在使用模板时可以指定一个计算策略,它可以是函数对象,也可以是函数指针。
2015-08-19 11:05:01 1704
原创 C++手稿:STL入门
STL (Standard Template Library) 提供了一些常用的数据结构和算法的模板,1998年加入C++标准。 STL中有三个基本概念:容器:容纳各种数据类型的数据结构,是一系列的类模板。迭代器:迭代器用来迭代地访问容器中的元素。算法:用来操作容器中的元素,是一系列的函数模板。STL 容器STL中的容器定义在std命名空间下,需要引入头文件 , , , ,
2015-08-19 11:04:26 570
原创 C++手稿:std::string
字符串在很多编程语言中已经成为基本数据类型,C语言中我们使用char*来手动申请和维护字符串, 在C++中,可以使用std::string来方便地创建和操作字符串。string是一个模板类,它有basic_string定义:typedef basic_stringchar> string;C++的string可以通过成员方法c_str()转换为C语言的char*。
2015-08-18 14:23:43 718
原创 C++手稿:封装与继承
可见性级别C++类提供了数据结构和算法的封装,以及相应的3种可见级别。它们定义了不同的可见性:Public:当前类以及子类的方法中可见,外部可见。Protected:当前类以及子类的方法中可见,外部不可见。Private:当前类的方法中可见,外部不可见。在一个对象的成员函数中,可以调用其他同类对象的私有方法。多数现代的面向对象语言中,仅提供Private和Pub
2015-08-18 14:23:03 734
原创 C++手稿:虚函数与多态
C++类继承带来了诸多好处:基类代码复用、通用的方法和属性、更好的可维护性, 然而最大的好处莫过于提供统一的接口。接口是一种对类型的抽象,它统一了一系列类的行为, 不同类的对象之间交互更加容易。Java、objective C等面向对象语言都提供了接口的概念, 在C++中,可以通过抽象类来实现一个接口。C++通过虚函数实现了多态:通过基类指针或引用调用虚函数时,会调用当前对象的实际类型中声
2015-08-18 14:22:17 1227
原创 jQuery事件:bind、delegate、on的区别
最近在AngularJS的开发中,遇到一个神奇的事情:我们用到livebox来预览评论列表中的图片, 然而评论列表是由Angular Resource动态载入的。不可思议的是,点击这些动态载入的图片仍然会触发lightbox的图片预览。 难道lightbox使用先进的MutationObserver技术监听了DOM的变化?观察lightbox源码才发现,原来只是jQuery的.on()方法:
2015-08-18 14:20:57 3869
原创 C++手稿:运算符重载
运算符重载运算符重载就是对已有的C++运算符赋予更多的语义,让一个运算符可以作用于其他的数据类型。 典型地,让运算符接受一个类的对象作为参数。通常有两种方式来重载一个运算符:声明一个普通函数,作为类的友元。声明为类的成员方法。事实上,运算符的本质是函数。每个运算符调用会转换为函数调用,运算符的操作数转换为函数参数。 运算符的重载本质上是方法的重载。这些运算符不允
2015-08-18 14:20:12 669
原创 C++手稿:类的静态和常量成员
静态成员对象成员的声明前加static即可定义为静态成员,静态成员必须在声明类的文件中进行声明(通常会初始化),否则链接错。 访问静态成员可以通过类名,也可以通过对象名。class CPerson{ static int count;};int CPerson::count = 0;CPerson p1, &p2 = p1, *p3 = new CPerson(
2015-08-16 21:26:14 677
原创 C++手稿:对象的生命周期,构造与析构
类的声明C++引入类的概念来实现面向对象程序设计,先来看一个简单的类的声明:class CPerson{ public: // 构造函数 CPerson(){ cout"constructor"endl; } // 构造函数(重载) CPerson(int age){ cout"constructor
2015-08-16 21:25:38 1557
C/C++ 语言参考
2011-03-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人