摘要:
1、default 构造方法意味着,没有外来信息的情况下,进行初始化,构造出一个对象。对于有些对象是很合理的,比如数值之类的对象,可以初始化为0;对于指针之类的对象,初始化为null;对于集合如vector,list,可以初始化为一个空容器。2、对于有些对象,必须要有外来信息,才能构造出一个有意义的对象。比如Person,要有name才能构造出一个有意义的Person对象。3、因此,对于没有外来信息,也能合理构造出一个对象的类,必须提供default 构造方法。对于没有外来信息,不能构造出一个对象的类,不能有default构造方法。4、现在考虑,没有default构造方法,使用类会有哪些限制?
阅读全文
posted @ 2014-03-02 18:52
Andy Niu
阅读(590)
推荐(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
阅读(563)
推荐(0)
编辑
摘要:
1、首先一点,对于海量数据处理,思路基本上是确定的,必须分块处理,然后再合并起来。2、对于每一块必须找出10个最大的数,因为第一块中10个最大数中的最小的,可能比第二块中10最大数中的最大的还要大。3、分块处理,再合并。也就是Google MapReduce 的基本思想。Google有很多的服务器,每个服务器又有很多的CPU,因此,100亿个数分成100块,每个服务器处理一块,1亿个数分成100块,每个CPU处理一块。然后再从下往上合并。注意:分块的时候,要保证块与块之间独立,没有依赖关系,否则不能完全并行处理,线程之间要互斥。另外一点,分块处理过程中,不要有副作用,也就是不要修改原数据,否则
阅读全文
posted @ 2014-03-02 15:58
Andy Niu
阅读(17796)
推荐(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
阅读(241)
推荐(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
阅读(550)
推荐(0)
编辑