上一页 1 ··· 26 27 28 29 30 31 32 33 34 ··· 58 下一页
  2014年1月23日
摘要: 1、C++0X,不确定哪一年出来,意指200X版的C++2、C++标准程序库的主要机能有:STL,iostreams,locals等。3、TR1:Technical Report 1,只是一份规范。添加了智能指针,泛型方法指针,正则表达式等内容。 阅读全文
posted @ 2014-01-23 17:55 Andy Niu 阅读(335) 评论(0) 推荐(0) 编辑
摘要: 1、严肃对待编译器发出的警告信息,因为编译器作者对所发生的事情有更好的领悟,尽量争取“无任何警告”。2、不要过度依赖编译器的警告,因为不同编译器对待事情的态度不同。 阅读全文
posted @ 2014-01-23 17:49 Andy Niu 阅读(155) 评论(0) 推荐(0) 编辑
  2014年1月21日
摘要: 1、一般情况下,使用一个东西,只要说我有这个东西就行了,不需要定义。但是,对于类,必须要有定义,为啥? 因为创建对象,需要知道分配多大空间,这种情况,必须询问类的定义式,才知道。2、怎么解决上面的问题? 问题的关键是,必须知道对象占用多大空间。可以这样做,使用指向实现的类(pimpl idom)。包含一个指向对象的指针,这种情况,不需要直到对象占用多大空间。3、声明一个方法的时候,对于方法形参中的对象,不需要include类的定义,为什么? 这个事情是在调用端做的,方法声明端不需要inlucde。4、还有一种办法是,采用接口,接口中没有字段。 阅读全文
posted @ 2014-01-21 19:54 Andy Niu 阅读(807) 评论(0) 推荐(0) 编辑
摘要: 1、inline方法相当于文本替换,不需要承担方法调用的额外开销,同时还有潜在的优势,文本替换后,编译器会进行代码优化。而对于方法调用,编译器没有能力进行代码优化。2、显而易见,inline方法往往会导致目标代码膨胀变大。但是,对于方法本体很小的情况,可能会出现,替换后的文本比方法调用的代码还要小。这也意味着,一般情况下,只有方法本体比较小的情况,才应该声明为inline。3、特别注意:inline只是一个申请,而不是命令。同时,对于class定义中的方法实现,也暗示着申请inline。申请inline告诉编译器,进行文本替换,但最终能不能文本替换,还要取决于编译器。4、编译器拒绝对业务复杂( 阅读全文
posted @ 2014-01-21 19:37 Andy Niu 阅读(399) 评论(0) 推荐(0) 编辑
摘要: 1、异常安全(出现异常,保证安全)有三个保证: a、基本承诺:抛出异常,对象处于有效状态下; b、强烈保证:抛出异常,对象要么修改成功,要么会滚到初始状态,可认为操作的原子行; c、不抛出保证:保证不抛出异常。2、为了异常安全,常常需要使用资源管理类shared_ptr。为了做到强烈保证,即操作的原子性。常常使用策略:copy and swap。考虑指向实现的类(pimpl idom),修改这样对象使用copy and swap策略:首先对对象做个copy副本,修改副本,然后交换指针。3、异常安全保证,符合木桶理论的短板效应,异常安全保证等于最弱者。 阅读全文
posted @ 2014-01-21 19:04 Andy Niu 阅读(180) 评论(0) 推荐(0) 编辑
摘要: 1、定义一个对象,往往意味着必须承担构造成本,离开作用域,必须承担析构成本。即使这个对象没有使用过。2、你可能会认为,不会定义一个不使用的对象。考虑下面的情况下,定义一个对象,执行其他操作,然后使用对象,假如在执行其他操作的时候,出现异常,就导致构造和析构了一个没有使用的对象,解决办法是:一个对象的定义和使用,放在一起,中间尽量不要插入其他操作。也就是说,等到真正使用的时候,才去定义。3、如果当前不知道对象的初始值,就不要定义,不然会导致一次copy构造,一次copy赋值。而应该等到确定初始值的时候,直接使用初始值去copy构造。4、当出现循环怎么办?放在循环外,还是放在循环内? 放在循环外. 阅读全文
posted @ 2014-01-21 18:38 Andy Niu 阅读(648) 评论(0) 推荐(0) 编辑
摘要: 1、private继承意味着,根据某物实现出,继承父类的实现,关闭父类的接口,并不是Is-A的关系,不满足里氏代换,继承的内容访问权限都修改为private。2、那么问题来了,复合也表达根据某物实现出,那到底使用private继承还是复合呢?3、优先使用复合,除非是下面的情况:a、使用对象的protected成员;b、想要重新定义virtual方法。4、考虑下面的极端情况,有个empty类,占用空间大小为0,也就是说,没有字段和virtual方法,如果使用继承,子类大小不增加。如果使用复合,C++规定大小为0的独立对象,插入一个char到空对象,考虑到对齐,实际占用int。也就是说,在这种极端 阅读全文
posted @ 2014-01-21 18:18 Andy Niu 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 1、考虑下面的需求,对迭代器移动d个单位。因为不同类型的迭代器,能力不同,有的迭代器(vector,deque内置迭代器)可以一步到位移动到指定位置,有的迭代器(list内置迭代器)必须一步一步移动,怎么解决?2、很显然,需要判断迭代器的能力,也就是哪一类,不同分类的迭代器采用不同的做法。这需要在运行时判断迭代器的分类,效率低,有没有更好的办法呢?3、很自然地,我们想到增加一个中间层,对不同分类的迭代器封装,对外暴露迭代器的类型信息,也就是在编译器就确定它的分类。具体做法如下: a、每种集合的内置迭代器,都有一个值表示自己的分类,使用typedef 为它的分类取个别名,对外暴露别名; b、.. 阅读全文
posted @ 2014-01-21 17:54 Andy Niu 阅读(308) 评论(0) 推荐(0) 编辑
  2014年1月20日
摘要: 设计class 的时候,需要好好考虑下面的问题:1、新type的对象应该如何被创建和销毁?2、对象的初始化和对象的赋值该有什么样的差别?3、新type的对象如果pass by value,意味着什么?4、什么是新type的合法值?5、新type需要某个继承体系吗?6、新type需要什么样的转换?7、什么样的操作符和函数对新type的对象是合理的?8、该如何访问新type对象的成员?9、什么是新type未声明的接口?10、新type有多么一般化?是否应该使用template? 阅读全文
posted @ 2014-01-20 21:29 Andy Niu 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 1、所谓软件设计,就是“让软件做出你期望它做的事情”的步骤。首先是构想,考虑对外暴露的接口,然后实现。2、客户没有正确使用自己提供的接口,自己也要负担一部分责任,思考自己的接口是不是简单明了,容易理解。3、对于多个形参的接口,最好表明每个形参的类型和有效范围。4、尽量限制哪些事能做,哪些事不能做,尽早暴露错误。如果没有好的理由,与内置类型保持一致。5、减少用户出错的可能性,考虑,在堆上获取的资源,期望用户使用资源管理类对它封装,但是用户可能忘记。那么,我就对资源封装,并返回给用户一个资源管理对象。对于引用次数为0,执行其它操作的资源管理类,应该在内部指定删除器。 阅读全文
posted @ 2014-01-20 21:24 Andy Niu 阅读(315) 评论(0) 推荐(0) 编辑
上一页 1 ··· 26 27 28 29 30 31 32 33 34 ··· 58 下一页