主题:【调查】大家都主要用什么写程序? -- 还是不懂
看了下面的文章,大部分是挺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的企图。
(待续〉
- 相关回复 上下关系8
😄M不是东西, 水风 字101 2005-05-29 23:52:45
mathta啥的吧。好像是个数据分析软件啥的 葡萄干 字10 2005-05-30 05:59:11
【原创】C,偶而用用C++, 老成都 字227 2005-05-27 18:57:08
【原创】俺来挺一下C++
Java里面也不是不能进行Reference或者返回多个值的 你克我服 字553 2005-05-29 21:45:40
服兄是改变了题目的原意了 无斋主人 字664 2005-05-31 07:33:58
呜呜呜,老兄误会俺了 你克我服 字1269 2005-05-31 08:13:32
有些不同意见,Java(5.0) 现在支持Generics。 Highway 字493 2005-05-27 15:50:08