2014年3月2日
摘要: 1、default 构造方法意味着,没有外来信息的情况下,进行初始化,构造出一个对象。对于有些对象是很合理的,比如数值之类的对象,可以初始化为0;对于指针之类的对象,初始化为null;对于集合如vector,list,可以初始化为一个空容器。2、对于有些对象,必须要有外来信息,才能构造出一个有意义的对象。比如Person,要有name才能构造出一个有意义的Person对象。3、因此,对于没有外来信息,也能合理构造出一个对象的类,必须提供default 构造方法。对于没有外来信息,不能构造出一个对象的类,不能有default构造方法。4、现在考虑,没有default构造方法,使用类会有哪些限制? 阅读全文
posted @ 2014-03-02 18:52 Andy Niu 阅读(592) 评论(0) 推荐(0) 编辑
摘要: 1、考虑下面的情况,有个方法,如下: void Print(ostream& s, const Base array[], int size) { for(int i=0; i< size; ++i) { s<<array[i]; } }2、对于Base baseArray[10]; Print(cout, baseArray, 10) 没有问题。在C++中,子类对象组成的数组,可以复制给父类的引用或者指针。数组名也可以认为是个地址。 考虑: Derived derivedArray[10]; Print(cout, derivedArray, 10) 会... 阅读全文
posted @ 2014-03-02 17:10 Andy Niu 阅读(565) 评论(0) 推荐(0) 编辑
摘要: 1、首先一点,对于海量数据处理,思路基本上是确定的,必须分块处理,然后再合并起来。2、对于每一块必须找出10个最大的数,因为第一块中10个最大数中的最小的,可能比第二块中10最大数中的最大的还要大。3、分块处理,再合并。也就是Google MapReduce 的基本思想。Google有很多的服务器,每个服务器又有很多的CPU,因此,100亿个数分成100块,每个服务器处理一块,1亿个数分成100块,每个CPU处理一块。然后再从下往上合并。注意:分块的时候,要保证块与块之间独立,没有依赖关系,否则不能完全并行处理,线程之间要互斥。另外一点,分块处理过程中,不要有副作用,也就是不要修改原数据,否则 阅读全文
posted @ 2014-03-02 15:58 Andy Niu 阅读(17814) 评论(2) 推荐(3) 编辑
摘要: 1、C语言中的转型操作符有两个问题: a、是个通用的转换操作符,也就是说,可以从一个类型转换到其他类型。通用必定是低效率和冗余的,因为要考虑很多情况。 b、在代码中,难以辨认出哪些是类型转换。2、C++提供了新式的转换操作符,有static_cast, dynamic_cast, const_cast, reinterpret_cast, 可以认为对不同的类型转换进行了细化,精确地指出意图,效率高。另外一方面,很容易在代码中辨认出这些类型转换。3、考虑,C++新式转换符的用法。 a、const_cast:去除对象的常量性。 b、dynamic_cast:用于向下转型或者跨系转型,类型必... 阅读全文
posted @ 2014-03-02 15:28 Andy Niu 阅读(243) 评论(0) 推荐(0) 编辑
摘要: 1、每当产生一个对象,必定调用构造方法。因此,禁止产生对象的做法就是,将所有的构造方法声明为private。2、只有在类的内部才可以访问private成员,有两层含义:在类的内部可以访问this的private成员,同时可以访问同类对象的private成员。3、将构造方法声明为private,只是限制了在外部调用构造方法产生对象,还是有办法可以产生对象。办法有: a、类暴露一个static方法,在static方法内部调用private构造方法,产生对象返回。 b、在类中声明友元方法,或者友元类,这样的话,就可以访问该类的private构造方法。4、考虑,只产生一个对象。该怎么办?使用友元方.. 阅读全文
posted @ 2014-03-02 11:19 Andy Niu 阅读(551) 评论(0) 推荐(0) 编辑