编程C++时,我们习惯于在需要时创建复制构造函数(或者我们被教导).几年前切换到Java时,我注意到现在正在使用Cloneable接口.C#遵循定义ICloneable接口的相同路由.在我看来,克隆是OOP定义的一部分.但我想知道,为什么创建这些接口,并且复制构造函数似乎已被删除?
当我想到它时,我开始认为如果需要复制一个类型未知的对象(如对基类型的引用),则复制构造函数将没有用处.这看似合乎逻辑.但我想知道是否还有其他原因我不知道,Cloneable接口是否比拷贝构造器更受青睐?
我认为这是因为Java和C#中的复制构造函数对于引用类型没有这种固有的需求.在C++中,对象被命名.你可以(并且你最常见)复制(并在C++中移动)它们,例如从函数返回时,因为返回指针需要你分配动态内存,这将是缓慢而痛苦的管理.语法是T(x),因此使构造函数采用T引用是有意义的.C++无法创建克隆函数,因为这需要再次按值返回一个对象(因此另一个副本).
但在Java中,对象是未命名的.只有对它们的引用,可以复制,但不复制对象本身.对于你真正需要复制它们的情况,你可以使用克隆调用(但我在其他文章中阅读克隆是有缺陷的.我不是java程序员所以我不能评论).由于不返回对象本身,而是返回对象的引用,因此克隆函数就足够了.还可以覆盖克隆功能.这不适用于复制构造函数.顺便说一句,在C++中,当你需要复制一个多态对象时,clone
也需要一个函数.它有一个名字,即所谓的虚拟拷贝构造函数.