上一页 1 ··· 32 33 34 35 36 37 38 39 40 ··· 58 下一页
  2013年12月27日
摘要: 1、什么是复合? 复合是类型之间的一种关系,某种类型的对象内含其他类型的对象。2、为什么需要复合,他解决什么问题? 为了代码复用。3、复合有两层含义:Has-A和根据某物实现出。在应用域中,表示Has-A,比如:Person有一个地址,有一个所属公司。在实现域,表示根据某物实现出,比如缓冲区,互斥器等概念。4、复合可以分为:关联,聚集,组合。关联是1对1的关系,聚集和组合是多对1的关系。组合比聚集的关系更紧密,举例来说,大雁聚集成雁群,两个翅膀(和其他的部位)组合成大雁。5、关联与依赖有区别,关联表示内含一个对象,依赖表示执行一个动作的时候,依赖形参。比如:Person关联地址,Perso.. 阅读全文
posted @ 2013-12-27 18:31 Andy Niu 阅读(347) 评论(0) 推荐(0)
  2013年12月24日
摘要: 本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制。之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解。在开始之间,首先要讲一个概念,closure(闭包),这个概念是理解lambda的基础。下面我们来看看wikipedia上对于计算机领域的closure的定义:Aclosure(alsolexical closure,function closureorfunction value)is afunctiontogether witha referencing environmen 阅读全文
posted @ 2013-12-24 19:28 Andy Niu 阅读(7467) 评论(1) 推荐(0)
摘要: 1、使用Non-Virtual Interface 实现方法模版 将虚方法声明为private,子类重写private的虚方法,在父类中通过public方法调用虚方法。NVI的优点是:可以在虚方法之前和之后做一些事情。2、使用方法指针实现策略模式 在类中关联一个方法指针,方法指针的形参是类对象的引用。实例化一个对象的时候,把一个方法传递给对象,这就意味着每个对象都有一个方法。这种方式提供了一些有趣的弹性:a、同一类型的不同对象可以有不同的计算方法;b、在运行期可以更改对象的计算方法。这种方式的缺点是:计算方法不能访问protected成员,要解决这个问题,只能弱化类的封装。3、使用tr1:.. 阅读全文
posted @ 2013-12-24 19:22 Andy Niu 阅读(230) 评论(0) 推荐(0)
摘要: 1、什么是多态? 父类指针指向子类对象,运行时期调用方法的时候,根据方法拥有者的真实类型,确定调用哪个方法。2、如何实现多态? 要实现多态,需要加一个中间层,暴露父类的方法,内部根据指针的真实类型决议方法。 C++多态的实现方法是:每个类对应一个虚方法表vtbl,子类把父类的虚方法整体拷贝一份,对于重写的虚方法进行置换,换成重写后的方法。每个类对象内有一个vptr指向本类的虚方法表,无论父类对象还是子类对象,vptr都在相同位置。也就是说,即使编译器把子类对象当成父类对象来解释,也是没有问题的,在同样位置可以找到vptr,然后调用相应的方法。3、显而易见,C++实现多态,要求每个类都有一... 阅读全文
posted @ 2013-12-24 18:54 Andy Niu 阅读(1193) 评论(0) 推荐(0)
  2013年12月23日
摘要: 1、代码复用有两个方式:继承和复合。2、继承分为public继承和private继承,public继承是继承接口,也就是父类提供的接口,子类承若仍然提供,内部有可能修改实现,子类与父类是IS-A关系。private继承是继承实现,父类提供的接口,子类不再提供,子类与父类不是IS-A的关系,不满足里氏代换,private表示的意义是,根据某物来实现。3、复合可以分为关联,聚合,组合。关联是一对一的关系,聚合和组合都是多对一的关系,但二者的紧密程度不一样。举例来说,大雁聚合成雁群,翅膀和脚组合成大雁。复合表示的意义也是,根据某物来实现。更合理的说法应该是,委托某物去做某件事。4、关联与依赖不同,关 阅读全文
posted @ 2013-12-23 19:19 Andy Niu 阅读(751) 评论(0) 推荐(0)
摘要: 1、过载:在一个类中(也就是一个作用域),方法名相同,形参表不同的方法。2、重写:父类方法使用virtual,子类方法和方法的方法名,形参表,返回类型相同,子类可以不使用virtual,但是建议使用virtual方法。3、子类和父类的方法名相同,除了重写的情况下,都是隐藏。4、为什么搞出隐藏? 隐藏的本质就是,子类对象无法调用,与子类方法同名的父类方法。这样做有什么意义呢? 首先考虑,Base有方法Say(),Derived有方法Say(int),子类对象调用方法的时候,少写了参数,比如derived.Say() 就会变成调用父类的方法,这和程序员的期望不一样。有了隐藏,编译器明确表示错误.. 阅读全文
posted @ 2013-12-23 19:04 Andy Niu 阅读(910) 评论(0) 推荐(0)
摘要: 举个最简单的例子,A向B发送一个数字,B如何检测数字在传输过程中有没有发生错误呢? A和B之间,定下一个协议,两边都知道一个除数X,A向B发送数字的时候,同时把余数附带后面发过去。比如,两边定的除数是5,A发的数字是13,那么A实际发的数据可以认为是 13&3,B接收到这个数据,知道前面是被除数,后面是余数。检查数字传输过程是否出错的办法是 (13-3)/ 5 是否整除,如果不整除,可以认为数字传输过程中,肯定出错,比如发来的数据是 11&3。只能检查部分出错的情况,比如传输过程变成18&3,不能检查出错误。 阅读全文
posted @ 2013-12-23 18:45 Andy Niu 阅读(482) 评论(0) 推荐(0)
摘要: 1、使用场景 virtual方法的使用场景:父类告诉子类,继承接口,修改实现,从而可以面向接口编程。 non-virtual方法的使用场景:父类告诉子类,继承接口和实现,从而可以代码复用。2、成员方法是一种封装技术,暴露给程序员。对于编译器而言,没有成员方法的概念,编译器会把成员方法编译为普通方法,方法的拥有者(也就是对象)转化为普通方法的形参,这个形参是const指针,名称为this,指向的类型是方法拥有者的类型。3、编译器编译的时候,只知道指针的表面类型,正是这个表面类型引导编译器去解释指向对象的大小和内容,那么问题来了? 对于non-virtual方法,子类继承接口和实现,继承的方... 阅读全文
posted @ 2013-12-23 18:25 Andy Niu 阅读(2504) 评论(0) 推荐(0)
  2013年12月20日
摘要: 1、它解决什么问题?为什么设计出继承的各种访问权限? 可以这样认为,C++继承会把父类的东西拉到自己这里,这些东西都是自己的,父类中的字段和方法都有访问权限,如果我想改变这些东西的访问权限,该怎么办?C++继承的访问权限就是为了解决这个问题。2、它是如何解决的? a、public继承,对于继承的东西,子类访问权限和父类一样; b、protected继承,对于继承的东西,父类public在子类降级为protected,其它不变; c、private继承,对于继承的东西,父类public和protected在子类降级为private,其它不变。3、子类继承父类的所有东西,只不过有些内容不能... 阅读全文
posted @ 2013-12-20 19:54 Andy Niu 阅读(994) 评论(0) 推荐(0)
摘要: 1、它解决什么问题? 数据传输过程中可能出错,接收方想知道传输过程是否出错。2、它是如何解决的? 以奇校验为例说明,发送方和接收方约定,发的数据(一组bit)必定是奇数个1。接收方对接受的数据进行检查,如果数据中1的个数不是奇数,认为数据传输过程中,出现了错误,要求发送方再次发送。那么问题来了,发送方如何保证发送的数据一定有奇数个1呢?答案是增加一个调节位。如果发送的内容已经是奇数个1,调节位填0,如果发送的内容是偶数个1,调节位填1。从而保证了发送的数据(发送的数据内容+调节位)一定是奇数个1。3、优点和缺点 优点是简单,方便。 缺点是,只能检查错误,不能纠正错误,而且只能检查一部分... 阅读全文
posted @ 2013-12-20 18:52 Andy Niu 阅读(798) 评论(0) 推荐(0)
上一页 1 ··· 32 33 34 35 36 37 38 39 40 ··· 58 下一页