2013年12月19日
摘要:
程序员编程语录 1. 一个好的程序员是那种过单行线马路都要往两边看的人。(Doug Linder) 2. 程序有问题时不要担心。如果所有东西都没问题,你就失业了。(软件工程的 Mosher 定律) 3. 程序员的麻烦在于,你无法弄清他在捣腾什么,当你最终弄明白时,也许已经晚了。(超级计算机之父 Seymour Cray) 4. 我想大部分人都知道通常一个程序员会具有的美德。当然了,有三种:懒惰,暴躁,傲慢。(Perl 语言发明者 Larry Wall) 5. 编程时要保持这种心态:就好象将来要维护你这些代码的人是一位残暴的精神病患者,而且他知道你住在哪。(MartinGoldin...
阅读全文
posted @ 2013-12-19 20:23
Andy Niu
阅读(528)
推荐(0)
2013年12月18日
摘要:
1、什么是虚方法? 考虑Animal* pa = new Dog(); pa表面类型是Animal,实际类型是Dog。可以理解为,pa说,我指向Animal,说法是对的。但是不具体,实际上,pa指向Dog。pa->Say()是虚方法,在编译期,编译器只知道pa 的表面类型,不知道该调用Animal 的Say方法还是Dog 的Say方法,所以才叫做“虚方法”。只有在运行期,才根据pa 的真实类型,确定调用哪个方法。这就是虚方法。2、为什么需要虚方法?它解决了什么问题? 简单说,就是为了面向接口编程,库的提供者暴露接口,隐藏实现。库的使用者不需要知道内部的实现细节。3、它是如何解决的? 虚方
阅读全文
posted @ 2013-12-18 20:23
Andy Niu
阅读(533)
推荐(0)
摘要:
1、思考,不同类型的指针,到底有什么区别? 指向Animal的指针和指向Dog的指针,到底有什么区别?首先,指针的表示方法相同,指针的内容相同,都是一个int,表示地址。区别只是指向对象的类型不同(好像是废话)。这有什么意义呢? 这其实是告诉了编译器如何解释这个地址中的内存内容以及大小。也就是说,对于指向Animal 的指针,编译器把指向内容当作一个Animal,对于指向Dog 指针,编译器把指向的内容当作Dog。2、那么,问题来了,Animal* pa = new Dog(),是怎么做到运行期多态的呢? pa的表面类型是Animal,真实类型是Dog,编译器在编译时只知道pa的表面类型,..
阅读全文
posted @ 2013-12-18 18:45
Andy Niu
阅读(1636)
推荐(1)
2013年12月13日
摘要:
1、C++对象内存包含两部分:字段和虚方法表指针vptr,vptr指向vtbl,vtbl包含类型信息和一组虚方法,虚方法按照类的定义顺序进行排列。2、成员方法并不占用对象内存,无论是static方法,还是non-static方法。3、那么,思考一下,对象是如何绑定到成员方法的呢? 对于程序员,方法分为成员方法和普通方法。对于编译器,没有成员方法,因为成员方法,会转化为普通方法。比如person.SetName(),对于编译器来说,会转化为SetName(person),student.SetName()转化为SetName(student)。3、那么问题来了,这种方式,显然无法满足,运行时多.
阅读全文
posted @ 2013-12-13 20:15
Andy Niu
阅读(213)
推荐(0)
摘要:
1、解决的问题: 考虑下面的需求,有个集合模版vector,实例化一个类vector,一个类vector,创建对象 double_Vector和int_Vector,我想把int_Vector赋值给double_Vector,这个需求是合理的。思考一下,能成功吗?2、我们知道,同一个模版实例化出来的模板类,之间没有任何关系,是不同的类型,根本不可能赋值的,因为编译器生成的copy构造和copy赋值,形参都是同一类型。double_Vector的copy构造和copy赋值的形参都是vector对象,那现在怎么办呢?3、解决办法: 建立模版成员方法,copy构造模版成员方法和copy赋值模版成..
阅读全文
posted @ 2013-12-13 19:58
Andy Niu
阅读(307)
推荐(0)
摘要:
1、为什么使用traits? 考虑下面的需求,实现一个方法Advance(iter,n),接收一个迭代器iter和移动距离n,将iter向前移动n个距离。 分析,因为存在不同类型的迭代器,做同一件事情,大家的能力不一样,做法当然不一样。有的迭代器可以一下子移到目标,有的迭代器只能一步一步移动,进行n次。因此,在方法内,必须要判断迭代器的类型,然后进行相应的操作。这种方法当然不好,运行期判断类型,需要核对继承层次中的每个类,效率差。有没有更好的办法呢?2、解决办法: a、每个迭代器暴露一个接口,暴露自己类型的别名(使用typedef MyType Category),每个迭代器都使用相同的...
阅读全文
posted @ 2013-12-13 19:42
Andy Niu
阅读(366)
推荐(0)
摘要:
1、异常处理分为两个部分:抛出异常和捕获异常。2、抛出异常,类似于方法返回值,离开了作用域,局部对象销毁,因此需要有一个临时对象保存结果。C++特别强调,抛出一个异常,必定要一个临时对象接收,存在copy构造,这是不可避免的,因为抛出的异常已经离开了作用域,失去了控制权。3、捕获异常,类似于调用方法,将临时对象传递给catch中的局部对象,为了避免再次copy构造,catch语句应该使用引用。特别注意,内置类型的临时对象是不可修改的,也就是说,内置类型的临时对象不能赋值给non-const引用,但是异常对象是可以的,catch语句可以是non-const引用。4、捕获异常与调用方法的区别: .
阅读全文
posted @ 2013-12-13 19:04
Andy Niu
阅读(363)
推荐(0)
摘要:
1、为什么使用传const引用? a、被调方法中,形参不再进行copy构造,以及析构,提高效率。 b、传值,会出现对象切割的问题。2、有没有例外? 在编译器底层,引用是使用指针实现的。这就意味着,如果对象是内置类型,迭代器,函数对象,传值效率更高。因为传引用也就是传指针,而内置类型,迭代器,函数对象copy构造效率也很高,不会比copy构造指针效率差。
阅读全文
posted @ 2013-12-13 18:37
Andy Niu
阅读(1053)
推荐(0)
摘要:
1、软件开发工程中,常常出现争吵,为什么争吵? 存在两个解决方案,都有合理性。合理性越接近,争吵越激烈,比如合理性是5:5。如何合理性是9:1,估计不会争吵。2、争吵中,忌讳为私利。比如一个方案的合理性是4,但是这个方案对自己有利,自己可以少干活或者实现起来比较容易。3、争吵中,忌讳死不认错。为了维护自己的面子,拼命强调自己方案的合理性,指责别人方案的不合理性。同时不肯承认别人方案的合理性以及自己方案的不合理性。4、争吵中,忌讳太强势。有些人,自己的方案优于别人,争吵获胜后,还要嘲笑别人,从而显示自己的能力,这种人很惹人烦。做人要自信,坚强,认真,宽容,还要内敛,不要得理不饶人,处处显得比别.
阅读全文
posted @ 2013-12-13 18:18
Andy Niu
阅读(262)
推荐(0)
2013年12月10日
摘要:
1、考虑下面的需求,vector中放置Person,Person有age和name字段。在vector中查找第一个Person c,这个很简单,方法如下: vector::iterator iter = find(personVector.begin(),personVector.end(),c); 注意:find算法使用操作符==,比较对象是否相等,需要提供==重载。2、考虑下面的需求,在vector中查找第一个age>15的Person。使用find_if和仿函数。如下: iter = find_if(personVector.begin(),personVector.end(),G
阅读全文
posted @ 2013-12-10 20:52
Andy Niu
阅读(668)
推荐(0)