当前位置: 首页 > news >正文

数据库网站开发价格刷死粉网站推广

数据库网站开发价格,刷死粉网站推广,西安做网站的公司客服,网站建设纳入本单位日常性工作使用场景:当需要构建多个相同的类对象时,而且该类对象结构较为复杂,如果每个都重新组织构建会很麻烦。 其实,就是写一个拷贝构造函数,或者写一个拷贝每个成员变量的clone()方法。 举例说明:比如一个相亲网站…

        使用场景:当需要构建多个相同的类对象时,而且该类对象结构较为复杂,如果每个都重新组织构建会很麻烦。

        其实,就是写一个拷贝构造函数,或者写一个拷贝每个成员变量的clone()方法。

        举例说明:比如一个相亲网站需要定义一个“男人”类,可想而知描述清楚一个男人肯定需要很多属性吧,比如姓名、身高、体重、职业、财产大致情况、联系电话、微信号、QQ号等。如果一个男人同时有多个相亲对象时,每次都重新构建填写属性显然太麻烦,所以类中需要定义一个拷贝的方法。

先写一个简单的类:

#pragma once
#include <QString>
class singleMan
{
public:singleMan(QString name,double height,double weight,QString career,QString phoneNum);~singleMan();QString m_name;//姓名double m_height;//身高double m_weight;//体重QString m_career;//职业QString m_phoneNum;//电话};
#include "singleMan.h"
singleMan::singleMan(QString name, double height, double weight, QString career, QString phoneNum):m_name(name),m_height(height),m_weight(weight),m_career(career),m_phoneNum(phoneNum)
{
}singleMan::~singleMan()
{
}

直接赋值,打印出的内容也完全一样,还需要写什么拷贝构造吗?

singleMan sman("LaoWang", 178, 153, "programmer", "19969961024");singleMan sman1 = sman;cout << "sman:" << sman.m_name.toStdString() << ";" << sman.m_phoneNum.toStdString() << endl;cout << "sman1:" << sman1.m_name.toStdString() << ";" << sman1.m_phoneNum.toStdString() << endl;

        这里c++会自动创建一个默认的拷贝构造函数,将成员变量中的值复制一次。但是,当类中有指针类型成员变量时,默认的构造函数仅仅把地址复制一份,两个对象指向的是同一个内存地址,对象销毁时会造成同一个内存被释放两次造成double free,例子如下,添加一个指针类型成员变量-近半年工资流水:

singleman类中添加double* m_monthSalary指针成员变量:

double* m_monthSalary = nullptr;//近半年工资流水

类的析构中释放指针空间:

singleMan::~singleMan()
{if (m_monthSalary!=nullptr){delete m_monthSalary;m_monthSalary = nullptr;}
}
    double salary[6] = { 30000,30000,40000,50000,60000 };sman.m_monthSalary = salary;singleMan sman2 = sman;cout << "sman:" << sman.m_monthSalary[0] << sman.m_monthSalary[1] <<                     sman.m_monthSalary[2] << sman.m_monthSalary[3] << endl;cout << "sman2:" << sman2.m_monthSalary[0] << sman2.m_monthSalary[1] << sman2.m_monthSalary[2] << sman2.m_monthSalary[3] << endl;

调用打印没问题,但是程序结束后会报错:

         所以,这里需要自己写一个拷贝构造函数,实现中需要重新分配新的内存地址(即所谓的深拷贝):

//拷贝构造singleMan(const singleMan& man);//这里要用引用,引用做参数时可减少一次对象拷贝,同时避免了循环拷贝构造问题;
singleMan::singleMan(const singleMan& man)
{m_career = man.m_career;m_height = man.m_height;m_name = man.m_name;m_phoneNum = man.m_phoneNum;m_weight = man.m_weight;m_monthSalary = new double[6];memcpy(m_monthSalary, man.m_monthSalary, 6 * sizeof(double*));
}
    double* salary = new double[6];salary[0] = 30000;salary[1] = 30000;salary[2] = 40000;salary[3] = 50000;salary[4] = 60000;salary[5] = 65000;sman.m_monthSalary = salary;singleMan sman2 = sman;cout << "sman  salary: " << sman.m_monthSalary << endl;cout << "sman2 salary: " << sman2.m_monthSalary << endl;cout << "sman: " << sman.m_monthSalary[0]<<"," << sman.m_monthSalary[1] << "," << sman.m_monthSalary[2] << "," << sman.m_monthSalary[3] << endl;cout << "sman2:" << sman2.m_monthSalary[0] << "," << sman2.m_monthSalary[1] << "," << sman2.m_monthSalary[2] << "," << sman2.m_monthSalary[3] << endl;

        此时,上述问题貌似已经解决了,但是在实际使用过程中会有这种用法:将一个类对象赋值给另一个已经构造好的对象:

    singleMan sman3("LaoLi", 183, 160, "programmer", "19969960512");sman3 = sman;cout << "sman: " << sman.m_name.toStdString() << ";" << sman.m_phoneNum.toStdString() << endl;cout << "sman3:" << sman3.m_name.toStdString() << ";" << sman3.m_phoneNum.toStdString() << endl;cout << "sman  salary: " << sman.m_monthSalary << endl;cout << "sman3 salary: " << sman3.m_monthSalary << endl;cout << "sman: " << sman.m_monthSalary[0] << "," << sman.m_monthSalary[1] << "," << sman.m_monthSalary[2] << "," << sman.m_monthSalary[3] << endl;cout << "sman3:" << sman3.m_monthSalary[0] << "," << sman3.m_monthSalary[1] << "," << sman3.m_monthSalary[2] << "," << sman3.m_monthSalary[3] << endl; 

        这时,就不进入拷贝构造函数了,而是进入了默认的赋值操作符函数中,会有同样的问题,这时需要写一个赋值操作符重载函数:

    //赋值运算符重载(用新的对象的值全部替换原有项)singleMan& operator=(const singleMan& man);
singleMan& singleMan::operator=(const singleMan& man)
{if (m_monthSalary != nullptr){delete m_monthSalary;m_monthSalary = nullptr;}m_career = man.m_career;m_height = man.m_height;m_name = man.m_name;m_phoneNum = man.m_phoneNum;m_weight = man.m_weight;m_monthSalary = new double[6];memcpy(m_monthSalary, man.m_monthSalary, 6 * sizeof(double*));return *this;
}

再次调用问题得到解决:

最后,由于拷贝构造函数中代码和赋值运算符代码几乎一致,可以在拷贝构造函数中直接调研赋值运算符重载函数:

singleMan::singleMan(const singleMan& man)
{/*m_career = man.m_career;m_height = man.m_height;m_name = man.m_name;m_phoneNum = man.m_phoneNum;m_weight = man.m_weight;m_monthSalary = new double[6];memcpy(m_monthSalary, man.m_monthSalary, 6 * sizeof(double*));*/*this = man;
}

        如有问题,欢迎指正! 

参考文献:

【精选】C++创建型模式-原型模式_c++ 原型模式-CSDN博客

4. 原型模式(Prototype) (yuque.com)

http://www.tj-hxxt.cn/news/70279.html

相关文章:

  • iis 配置网站详解谷歌独立站seo
  • 苏州网站设计公司软文代写接单平台
  • 重庆网站制作公司多少钱零基础能做网络推广吗
  • 有做兼职的网站吗推广普通话ppt课件
  • 网站建设seo合同书长沙seo招聘
  • 肉菜配送网站建设建站cms
  • c2c网站管理系统下载不花钱网站推广
  • 杭州倍世康 做网站网站排名seo培训
  • 正规的网站建设百度搜索引擎推广步骤
  • 如何看织梦做的网站的源码百度竞价专员
  • 用meteor框架做的微博网站网站外链代发
  • 中国代加工网官网专业百度seo排名优化
  • 中山商城型网站建设站点搜索
  • 长沙装修公司排名十强兰州seo培训
  • 手机对比网站google浏览器网页版
  • 怎样找出那些没有做友链的网站谷歌浏览器下载安装
  • 电子商务网站与建设课件百度推广怎么赚钱
  • wordpress多功能主题 cosy商品标题seo是什么意思
  • 网站建设代理招标疫情防控最新数据
  • 外文网站字体广州seo外包多少钱
  • 用ps做的网站怎么发布推广普通话宣传海报
  • 手机零售网站 关键词今日新闻内容摘抄
  • wordpress 文章列表 分页seo岗位职责
  • 光谷网站建设百度一下百度首页登录
  • 公司 网站 模板seo公司软件
  • 网站建设找星火龙百度点击排名收费软件
  • 闵行做网站费用网络推广服务商
  • 整形医院网站建设推广优化搜索引擎营销
  • 哈尔滨 门户网站曼联目前积分榜
  • 安徽网站线上开发公司合肥网络推广软件系统