原型模式C++类的复制构造函数和赋值运算符
时间:2022-04-26
本文章向大家介绍原型模式C++类的复制构造函数和赋值运算符,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、简介
1、原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
2、为什么会用到原型模式?
(1)既然可以直接new,为什么会用到原型模式?
这个可以从两个角度来说,第一,时间消耗角度:如果创建实例的构造函数非常的复杂,在执行这个构造函数时会消耗较长的时间,这时如果需要一个跟刚刚实例化对象参数差不多的实例(可以完全相同,也可以大部分相同)那么直接使用 new 来创建这样一个实例就显得太昂贵了,而如果使用原型模式克隆一个一模一样的实例(或者先克隆一个一模一样的实例,然后做小部分的改动)就显得非常的合理。第二,用户的修改麻烦程度角度,举个例子,假设要通过一个类实例化一各班同学的毕业信息,那么会有大量雷同的信息,这时如果要用new实例化,就需new很多次,更悲剧的是如果所有同学的信息都录入完毕,突然发现某个参数的信息录入错了,这时要对每一个实例分别进行修改,而如果使用原型模式克隆就不会出现这个问题。
(2)既然类可以直接赋值,为什么会用到原型模式?
因为类之间直接赋值的话,默认的拷贝函数是进行引用赋值的
对于指针的浅复制会造糟糕的结果,这点可以参见C++ primer plus "类和动态内存分配"章节,也可以参见我的另一篇技术博客
C++类的复制构造函数和赋值运算符
3、UML图
4、所属类别:创建型
二、原型模式的C++程序
1 // 原型模式.cpp : 定义控制台应用程序的入口点。
2 //
3
4 #include "stdafx.h"
5 #include<iostream>
6 using namespace std;
7
8 //声明一个虚拟基类,所有的原型都从这个基类继承,
9 class prototype
10 {
11 public:
12 prototype(){}
13 virtual ~prototype(){}
14 virtual prototype* clone() = 0;//纯虚函数,需要供继承者自行实现
15 //为了测试而添加的函数
16 virtual void show()=0;
17 };
18
19 // 派生自Prototype,实现Clone方法
20 class concreateprototype :public prototype
21 {
22 public:
23 concreateprototype (){}
24 concreateprototype (const prototype&){}
25 virtual ~concreateprototype (){}
26 virtual prototype* clone()
27 {
28 return new concreateprototype(*this);
29 }
30 //为了测试添加一个show函数
31 void show()
32 {
33 cout<<"hello,i am a concreateprototype"<<endl;
34 }
35 };
36
37 //用户接口
38 int _tmain(int argc, _TCHAR* argv[])
39 {
40 prototype *people1=new concreateprototype();
41 prototype *people2=people1->clone();
42 people2->show();
43 return 0;
44 }
http://www.cnblogs.com/bewolf/p/4232079.html
- Python使用MD5加密字符串
- Spark MLlib之 KMeans聚类算法详解
- Python时间与时间戳转换
- linux配置ssh互信实现免密登陆
- uva--1339 - Ancient Cipher(模拟水体系列)
- Python获得13位unix时间戳
- Centos7下LVM对文件系统进行在线扩容
- centos7编译安装Redis
- hdu----(5023)A Corrupt Mayor's Performance Art(线段树区间更新以及区间查询)
- Redis单线程架构
- hdu----(4521)小明系列问题——小明序列
- Redis数据结构和内部编码
- Redis全局命令
- nginx使用GeoIP限制国家访问
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 前端成神之路-CSS文字文本样式
- 前端成神之路-CSS(选择器、背景、特性)
- 前端成神之路-列表和表单
- 前端成神之路-HTML
- Windows下如何查看某个端口被占用,以及如何杀死某个进程
- VSCode插件Todo Tree如何忽略某些文件夹?
- Express新建项目与配置项目热加载
- selenium控制已打开的页面
- 盘点一下lua脚本和python的区别(基础)
- python识别视频黑屏或者低清晰度
- python在linux环境下安装skimage
- python3异步爬虫 ——aiohttp模板使用
- [PHP] 抽象工厂设计模式-创建型设计模式
- [javascript] 支付宝小程序网络GET请求
- [PHP] 生成器模式-创建型设计模式