2010-02-01 44 views
1

尊敬的先生!什么是不是在Java中的OOP功能,但C++有这些功能?

因为我还没有学习java,但大多数人都说C++比Java有更多的OOP特性,所以我想知道C++具有哪些功能,而java不具备哪些功能。请解释。

+8

尊敬的先生?我可以习惯这一点。 – GManNickG

+1

'goto'和'#define':) –

+0

问题是C++不仅仅是一种OO语言(它具有很多来自其他类型编程的特性)。 Java只是一种OO语言。所以在C++中有很多与OO无关的功能,而Java都不支持这些功能。 –

回答

5

这可能是有争议的,但一些作者说,使用自由函数可能比书写方法更适合面向对象。所以按照作者的观点,C++中的自由函数使得它比Java更具OO(不具有它们)。

解释是有一些操作没有真正执行对象的一个​​实例,而是外部的,并且对这些情况具有外部定义的操作改进了OO设计。有些情况是对两个对象的操作,这两个对象本身并不是任何一个操作。增加一个值显然是对该值的一种操作,但用另外两个(或连接)的总和创建一个新值并不是真正对该实例的操作。当你写:不上a进行

String a = "Hello"; 
String b = " World"; 
String c = a.append(b); 

append操作:手术后a仍然是“你好”。该操作不在b上执行,它是在ab上执行的外部操作。在这个特定的例子中,实现这个操作的最OO方式是提供一个带有两个参数的新构造函数(毕竟,这个操作是在新的字符串上执行的),但另一种解决方案是提供一个外部函数append需要两个字符串并返回第三个字符串。

在这种情况下,如果两个实例的类型都是相同的,那么该操作自然可以作为该类型的静态方法执行,但是当混合不同类型时,操作并不是真正的一部分,它可能最终会成为完全不同的类型。在某些情况下,免费函数与Java类中的Java一样是伪造的,它不代表任何OO元素,但相当简单的粘合方式是将静态方法绑定到自由函数上,因为该语言不支持前者。请注意,所有这些算法都不在集合上执行,也不在包含的类型的实例上执行。

+2

你可以在DDJ上阅读关于“非成员函数如何改进封装”的文章http://www.ddj.com/cpp/184401197 –

+0

感谢@dtrosset,我试图自己找到引用。 –

+0

+1因为我认为Java“每个函数都在一个类中”*不鼓励*这种有用的思考方式,但正如你所说,你实际上可以完全“伪造”免费函数,所以我不会说Java语言*禁止* 这个。 –

4

C++是一个巨大的语言和C++开发人员在开发过程中只使用一小部分是很常见。这些语言特性经常被认为是C++最难以掌握和经常避免的部分。

+1

+1:Template Metaprogramming是shiznit。 – Narfanator

+7

模板元编程有时非常有用,但它不是真正的OOP功能。 –

+0

当然你是对的,模板元编程不是一个面向对象的功能。我将它包括在内,因为Java和C++都有泛型,但模板实现是非常不同的。谢谢你保持诚实:-) – mikelong

1

在C++中,您可以绕过OO模型并构建自己的东西,而在Java中,VM决定您不能。非常简化,但你知道......谁有时间。

+0

你的gravatar *在动画形式* *更好* – ergosys

+0

我知道。我认为它会动画,但我会采取我能得到的。 –

6

java.sun.com

的Java省略了许多很少使用,知之甚少,混淆的C++功能,在我们的经验比带来利多的悲伤。这些省略的特性主要由运算符重载(尽管Java语言确实有方法重载),多重继承和广泛的自动强制组成。

有关更详细的比较,请查看此Wikipedia page

+0

我同意。一些C++功能被认为是不好的做法...有些人。 –

+2

@Josh:如果初学者驱动程序滥用,某些C++功能被认为是不好的。我们这些拥有先进驾驶执照的人都喜欢所有功能,并且不会滥用它们(因为我们可能已经学会了为什么它很糟糕的难题)。 –

+0

我想说关于MI的令人困惑的事情不是MI本身,而是如何指定基类的虚拟或非继承,而不是派生类来控制它。 –

1

我想有些人会考虑运算符重载面向对象的功能(如果你查看二元运算符没有太大的不同,然后类方法)。

1

要小心。那里有多种OOP的定义。例如,Wegner 87和Booch等人91中的定义与人们在Java is not pure a OOP language中所说的不同。

所有这些“我的语言比你的语言更OO”东西有点没有意义,IMO。