c++ copy constructor VS java clone

今天有一同学问我,java怎么没有拷贝构造函数呢,java的clone就是c++的拷贝构造
函数么?
下面我分析一下这个问题:
而java中的clone是c++中的拷贝构造函数么?事实上并不是这样的,java是在
语言层面对prototype模式的支持。java事实上很少需要拷贝,除非你需要显示的得到
对象的拷贝。因为java中从来都不会有显示的对象,对象都是由引用来持有,所以无论
是你在试图传递对象或把对象作为返回值,实际传递或返回的是引用,所以生成的副本
都是引用本身,这个特点从根本上避免了对象无谓的生成副本和对拷贝构造函数的需要。
而c++是有显示对象对象存在的,我们经常一不小心把对象毫无意义的生成了副本,甚至
由此造成自己觉诡异的错误,有一次给同学调试n长的c++程序,发现他的程序中大量充满这样的代码:

void f(Point x){
//some operation to x
}

并且试图多个函数对同一个Point进行操作,一眼就能看出肯定会出问题的,因为对对象的所有操作都不会反映在实参,你一直在操作对象的拷贝---another object。
拷贝构造函数面临的另一尴尬问题时,成员中存在指针数组的情况下:

class Person{
//...
};
class Student: public Person{
//..
};

class Teacher: public Person{
//...
};

class A{
//...
private:
Person *p[8];
};


当我们试图去深拷贝A的对象时,拷贝构造函数显得无能为力,因为构造函数是不支持多态
的,这就需要我们去显示的实现prototype模式,在Person的继承体系下实现clone函数:

class Person{
public :
virtual Person *clone(){
return new Person(this);
}
//...
};
class Student: public Person{
Person *clone(){
return new Student(this);
}
//..
};

class Teacher: public Person{
Person *clone(){
return new Teacher(this);
}
//...
};

这样我们只需要在class A的拷贝构造函数中使用clone,就可以了完成我们的深拷贝任务了。但c++这种没有单根继承的情况下,是不可能从语言级别提供prototype模式的支持的。

结论:java根本不需要拷贝构造函数,java的clone方法是原型(prototype)模式的在
语言层面的支持,同时为需要显式的拷贝提供了支持。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值