五千年(敝帚自珍)

主题:【调查】大家都主要用什么写程序? -- 还是不懂

共:💬139 🌺25
全看分页树展 · 主题 跟帖
家园 【原创】俺来挺一下C++

看了下面的文章,大部分是挺Java的,的确Java同C++相比是领先一代,在下这里要稍微唱一下反调。这个帖子是要说一些Java做不到,但C++可以做到的东西。说的不对的地方,请高手们指出。

先从最简单的一个函数说起,我要实现一个交换两个数的函数,在C++里很容易。

void swap(int &a, int &b)

{

int t = a;

a=b;

b=t;

}

这个函数Java就实现不了,因为Java中没有pointer,而Java的object reference,相当于C++的pointer。Java中没有对应C++的reference的实现,也没有取地址&的操作。扩展一下这个问题,就是Java无法处理多返回值的情况,C++可以通过传入Reference或Pointer来实现,而Java只能将所有返回值group成一个object来返回。

再进一步,如果我想让这个函数对所有type都适用,那么在C++中很简单,用个template就行了,

template<typename T>

void swap(T&a, T&b)

{

T t=a;

a=b;

b=t;

}

这样的话,只要的我的class实现了copy-contructor 和 operator=(),我就可以用这个swap函数,而不局限于int

MyClass a,b;

...

swap(a,b); // exchange value between a and b

这个功能Java更实现不了,因为到目前为止,Java还不能support template,虽然有消息说Java将来会支持template。

不支持template也就无法支持Generic Programming (当然Java developer可以用一些技巧来模拟Generic Programming,但这不是语言本身所支持的)。

现在我们来进一步讨论,我们知道C++有庞大的STL Library, 在STL里包含了各种Container,Iterator,Algorithm等等前人已经帮你完成的东西,大部分情况下,你只需要使用这些东西,而不需要reinvent the wheel,Java Developer会说你说的东西Java也基本能做,比方说Java中也有vector,map什么的Container。但是Java实现不了的(或曰很难实现的)是下列一个情形,假设我要实现一个三元组的Container triplet,<Key, Value1, Value2>,而这个需求并不夸张,因为现实世界有许多3元组关系的对象。用C++的话就很容易实现,

template <typename _Tkey, typename _Tv1, typename _Tv2>

triplet {

......

iterator begin();

iterator end();

// detailed implementation omitted.

......

};

在triplet需要实现begin(), end()返回一个Iterator(实际上是一个struct *,这个struct包含first,second,third三个成员变量,代表key, val1,val2)。(我这里省略了其他具体实现)

具体来说,你需要对这个triplet do some thing,你就可以用STL的算法,

triplet<int, MyClass1, MyClass2> aTriplet;

......

for_each(aTriplet.begin(), aTriplet.end(), DoSomething); //DoSomething 是个function或functor

就可以了,其他各种STL算法都可以应用在这个Container上面。

而要实现这样一个Triplet的功能在Java中是很困难的。

稍微总结一下,Java这些局限是他的主要特点决定的,第一个特点是没有pointer,也就没有取地址&的操作,从程序的reliablity角度来看,是有好处的,因为大部分程序错误跟指针操作有关,但是同时也限制了灵活性。这个是好坏参半,孰优孰劣很难说。第二个特点是没有template,这点我个人觉得是个极大的缺陷,没有template,就失去了Generic Programming的强大武器。虽然很多东西Java也勉强可以做,但毕竟不如C++来得自然。所以Java community一直有将Template引进Java的企图。

(待续〉

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河