公司网站的具体的建设方案,推广教程,购物中心网站模板,网站制作企业有哪些概述
Clone函数是一种用于复制的计算机函数。在程序编写中#xff0c;除了自定义一个拷贝构造函数来实现对象复制外#xff0c;还可以实现一个clone函数。这需要借助编译器实现的一个隐藏拷贝构造函数#xff0c;这样的做法#xff0c;更省心。 中文名clone函数外文名clon…概述
Clone函数是一种用于复制的计算机函数。在程序编写中除了自定义一个拷贝构造函数来实现对象复制外还可以实现一个clone函数。这需要借助编译器实现的一个隐藏拷贝构造函数这样的做法更省心。 中文名clone函数外文名clone所属学科信息学
基本介绍
在C中要拷贝一个对象除了自定义一个拷贝构造函数来实现对象复制外还可以实现一个clone函数。这需要借助编译器实现的一个隐藏拷贝构造函数这样的做法更省心。
背后的原理是C的原型Prototype模式用原型实例指定创建对象的种类并且通过拷贝这些原型创建新的对象。
Prototype模式提供了一个通过已存在对象进行新对象创建的接口Clone Clone实现和具体的语言相关在C中通过拷贝构造函数实现。
注意clone函数是virtual的无法内联。
示例代码
#include stdafx.h
#include iostreamclass CA
{
public:int value;CA* clone() const { return new CA( *this );}//仅一个构造函数CA(int a ){valuea;}
};int _tmain(int argc, _TCHAR* argv[])
{CA* objAnew CA(10);CA* objtempobjA-clone();delete objA;std::coutobjtemp-value;delete objtemp;return 0;
}
Prototype 模式的应用场景在于你拿到一个 Base* 它指向某个 Derived 对象你想克隆出 Derived 对象但代码中不写出 Derived 的具体类型因为有很多派生类这种情况下你用构造函数是搞不定的就需要Prototype 模式了。
原型模式的作用
1、基本就是你需要从A的实例得到一份与A内容相同但是又互不干扰的实例的话就需要使用原型模式。
2、用原型实例指定创建对象的种类并且通过拷贝这些原型创建新的对象。这个其实和C的拷贝构造函数的作用是相似的但不相同实际上就是动态抽取 当前对象运行时的状态。
Clone方法
关于clone方法
在说明clone方法之前需要对值传递和引用传递有个初步的了解
其中需要注意的是第三条
1基本数据类型传值对形参的修改不会影响实参
2引用类型传引用形参和实参指向同一个内存地址同一个对象所以对参数的修改会影响到实际的对象
3String, Integer, Double等immutable的类型特殊处理可以理解为传值最后的操作不会修改实参对象。其本质上还是引用传递只不过这些类型是不可变类可以理解为传值
在对值传递和引用传递有个初步了解之后我们开始讲解clone方法。
使用clone方法的步骤
1、实现clone的类首先需要继承Cloneable接口以此接口是一个标识接口没有任何接口方法
2、在类中重写Object类的clone方法
3、在clone方法中调用super.clone
这样就可以得到实现clone类的的一个Object对象的复制但这存在一个问题如果这个类中还存在引用类型怎么办在就要对浅复制和深复制说明一下了。
浅复制和深复制
1、类中的成员皆为基本数据类型使用浅复制
2、类中的成员有引用类型此时需注意String, Integer, Double等immutable的类型特殊看待不当成引用类型使用深复制
浅复制和深复制的使用依据实际情况而定
浅复制被复制对象的所有变量都含有与原来对象相同的值引用变量仍然指向原来的对象
深复制被复制对象的所有变量都含有与原来对象相同的值引用引用变量指向被复制对象的新变量
原型模式的优势
一.为什么不用new直接新建对象而要用原型模式
首先用new新建对象不能获取当前对象运行时的状态其次就算new了新对象在将当前对象的值复制给新对象效率也不如原型模式高。
二.为什么不直接使用拷贝构造函数而要使用原型模式
原型模式与拷贝构造函数是不同的概念拷贝构造函数涉及的类是已知的原型模式涉及的类可以是未知的。
原型模式生成的新对象可能是一个派生类。拷贝构造函数生成的新对象只能是类本身。原型模式是描述了一个通用方法(或概念)它不管是如何实现的而拷贝构造则是描述了一个具体实现方法。 class base { public : base(); base(base obj); virtual ~base(); virtual base *clone() { return new base(*this) ; }; }; class derived : public base { public : derived(); derived( derived ); virtual base *clone(){return new derived (*this); } .... }; base *obj1 new base ; base *obj2 new derived ;//基类指针指向派生类对象怎样用基类指针创建一个新的派生类对象 用基类的拷贝构造函数显然不行。 base *obj3 obj1 .clone(); base *obj4 obj12.clone();
适用场景
1.资源优化场景
类初始化需要消化非常多的资源这个资源包括数据、硬件资源等。
2.性能和安全要求的场景
通过new产生一个对象需要非常繁琐的数据准备或访问权限则可以使用原型模式。
3.一个对象多个修改者的场景
一个对象需要提供给其他对象访问而且各个调用者可能都需要修改其值时可以考虑使用原型模式拷贝多个对象供调用者使用。
缺点
1、配备克隆方法需要对类的功能进行通盘考虑这对于全新的类不是很难但对于已有的类不一定很容易特别当一个类引用不支持串行化的间接对象或者引用含有循环结构的时候。
2、实现原型模式每个派生类都必须实现 Clone接口。
3、逃避构造函数的约束。 参考资料
1 C clone()函数的用法 CSDN2 【Linux内核】Clone函数和Cloneable接口简要说明 3 IT职场笔记 博客园4 关于clone()方法 CSDN5 Pytorch中clone(),copy_(),detach(),.data的辨析与应用 知乎6 java中的clone_51CTO博客