为了账号安全,请及时绑定邮箱和手机立即绑定

JAVA的构造器和C++的构造函数有什么区别?

JAVA的构造器和C++的构造函数有什么区别?

扬帆大鱼 2019-02-12 14:10:45
JAVA的构造器和C++的构造函数有什么区别?
查看完整描述

2 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

语法上不一样外 ,编程思想上,作用都是一样的,都是创建一个实例,,
还有就是c++有一个析构函数,与构造函数想对应,java则没有,
在delete这个实例的时候,自动调用这个函数,进行最后的操作,例如删除一些堆内存,释放一下,线程锁,等一些没用的资源,java没有析构方法

查看完整回答
反对 回复 2019-03-25
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

Java和C++在构造函数中调用虚函数的区别
首先可以认为,Java所有instance函数都是虚函数。
C++类构造函数中调用虚函数,并不能有多态效果。
这样设计的理由是:
在基类的构造函数中,派生类的成员尚未初始化,而派生类的虚函数定义可以使用派生类的成员,C++强制必须先初始化对象然后才能使用【这是C++设计new和构造函数的初衷】,所以不可以调用派生类的虚函数定义。
C++虚函数的实现机制也可以解释这一现象:
对象的虚函数表指针在调用构造函数前更新,指向该类的虚函数表。所以当调用基类的构造函数时,对象的虚函数表指针指向该基类的虚函数表,而不是指向派生类的虚函数表,所以虚函数调用没有多态效果。

但是
Java类的构造函数中调用虚函数,依然有多态效果。
我是在看《The Java Programming Language, fourth edition》5.5 Inheriting Nested Types 这一节时看到了在Field initializer中调用【虚】函数,仍然有多态的效果,大吃一惊,经验证属实。

《Thinking in Java, fourth edition》 Behavior of polymorphic methods inside constructors 这一节对此进行了评论:
If you call a dynamically-bound method inside a constructor, the overridden definition for that method is used. However, the effect of this call can be rather unexpected because the overridden method will be called before the object is fully constructed. This can conceal some difficult-to-find bugs.

总之,这是一把双刃剑,有利有弊,且弊大于利,要小心使用。《The Java Programming Language, fourth edition》5.5 Inheriting Nested Types 这一节举的例子可以使用两步初始化的方法解决,也可以使用延迟创建的方法解决,延迟创建是更好的办法。

C++ 的不懂..帮你找了一下




查看完整回答
反对 回复 2019-03-25
  • 2 回答
  • 0 关注
  • 911 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信