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

五八同城最新招聘信息国家优化防控措施

五八同城最新招聘信息,国家优化防控措施,手机h5网站,wordpress默认后台密码拷贝构造函数和赋值函数 什么是拷贝构造 是一种特殊构造函数,如果没有显式的实现,编译器就会自动生成。 class 类名 { public:// 拷贝构造类名(const 类名& that){} }; 什么时候会调用拷贝构造 当使用一个类对象给另一个新的类对象初始化时&…

拷贝构造函数和赋值函数

什么是拷贝构造

是一种特殊构造函数,如果没有显式的实现,编译器就会自动生成。

class 类名
{
public:// 拷贝构造类名(const 类名& that){}
};
什么时候会调用拷贝构造

当使用一个类对象给另一个新的类对象初始化时,就会自动调用拷贝构造。

#include <iostream>
using namespace std;
​
class Test
{
public:Test(void){   cout << "调用了普通的构造函数" << endl;}   Test(const Test& that){   cout << "调用了拷贝构造" << endl;}   
};
​
void func(Test t)
{
​
}
​
int main(int argc,const char* argv[])
{Test t1;        // 调用的是普通构造Test t2 = t1;   // 调用的是拷贝构造func(t1);       // 调用的是拷贝构造return 0;
}
拷贝构造的任务是什么

拷贝构造参数对象的所有成员变量挨个赋值给新对象的成员变量,一般情况下编译器自动生成的拷贝构造就能完全满足我们使用需求。

什么时候需要显式实现拷贝构造

当成员变量中有指针成员且指向了堆内存,就需要显式实现拷贝构造。

编译器自动生成的拷贝构造,只会对成员变量挨个赋值,如果成员变量中有指针变量且指向堆内存,结果就两个对象的指针变量同时指向一份堆内存,当它们执行析构函数时,会把这块堆内存释放两次,产生 double free or corruption 的错误。

正确的做法应该是先给新对象的指针变量重新申请一份堆内存,然后把旧对象的指针变量所指向的内存拷贝到新对象的指针变量所指向的内存。

#include <iostream>
using namespace std;
​
class Test
{int* ptr;
public:Test(int num){ptr = new int;cout << "new:" << ptr << endl;*ptr = num;}
​~Test(void){cout << "delete:" << ptr << endl;delete ptr;}
​/* 编译器生成的拷贝构造,会造成 double freeTest(const Test& that){ptr = that.ptr; }*/Test(const Test& that){// 给新对象的指针变量重新申请堆内存ptr = new int(*that.ptr);// 把旧对象的指针变量所指向的内存拷贝给新对象的指针变量所指向的内存,如果不方便解引用时可以使用memcpy函数}
​void show(void){cout << "val:" << *ptr << " addr:" << ptr << endl;}
};
​
int main(int argc,const char* argv[])
{Test t1(12345);Test t2 = t1;t1.show();t2.show();
​return 0;
}
什么是赋值函数

是一种特殊的成员函数,如果没有显式实现,编译器会自动生成。

class 类名
{
public:// 赋值函数const 类名& operator=(const 类名& that){}
};
什么时候会调用赋值函数

当一个旧对象给另一个旧对象赋值时会自动调用赋值函数。

当一个旧对象给另一个新对象初始化时会自动调用拷贝构造函数。

#include <iostream>
using namespace std;
​
class Test
{
public:Test(const Test& that){   cout << "调用了拷贝构造" << endl;}   
​void operator=(const Test& that){   cout << "调用了赋值函数" << endl;}   
};
​
int main(int argc,const char* argv[])
{Test t1;        // 调用了普通的构造函数Test t2 = t1;   // 调用了拷贝构造t1 = t2;        // 调用的是赋值函数return 0;
}
赋值函数的任务是什么

赋值函数与拷贝构造的任务几乎相同,都是挨个给成员变量赋值,但如果需要显式实现时,它的业务逻辑不同。

什么时候需要显式实现赋值函数

当需要显式实现拷贝构造时,就需要显式实现赋值函数,它们两个面临问题是一样的。

赋值函数不应该对成员指针变量赋值,而应该对象成员指针变量所指向的内存进行拷贝。

#include <iostream>
using namespace std;
​
class Test
{int* ptr;
public:Test(int num){ptr = new int;cout << "new " << ptr << endl;*ptr = num;}~Test(void){cout << "delete " << ptr << endl;// delete ptr;}
​Test(const Test& that){ptr = new int;// 如果不方便解引用,可以调用memcpy函数进行拷贝*ptr = *that.ptr;cout << "new " << ptr << "调用了拷贝构造" << endl;}
​const Test& operator=(const Test& that){// 当ptr和that.ptr指向的内存块大小一样,可以直接进行内存拷贝*ptr = *that.ptr;cout << "调用了赋值函数" << endl;return *this;/*当对象的ptr指向的内存与与that.ptr指向的内存块不一样大先释放旧的ptr再分配新的,要与that.ptr的内存块一样大然后再拷贝*/}
};
​
int main(int argc,const char* argv[])
{Test t1(1234);      // 调用了普通的构造函数Test t2 = t1;   // 调用了拷贝构造t1 = t2;        // 调用的是赋值函数return 0;
}
浅拷贝与深拷贝

拷贝就是一个对象给另一个对象赋值,编译器自动生成的拷贝构造和赋值函数执行的业务逻辑就是浅拷贝(成员指针给成员指针赋值),深拷贝就是把成员指针所指向的内存拷贝给另一个成员指针所指向的内存。

浅拷贝就是指针给指针赋值,深拷贝就内存给内存赋值。

注意:如果成员变量中没有成员指针,则浅拷贝就可以满足需求,如果如果成员变量中有成员指针且指向堆内存,则必须手动实现深拷贝,否则就会出现 double free or corruption 的错误。

http://www.hkea.cn/news/452464/

相关文章:

  • 织梦cms通用蓝白简介大气企业网站环保科技公司源码网络推广员招聘
  • 网站后台怎么添加图片视频app推广
  • 网站秒收录怎么做的经典软文案例和扶贫农产品软文
  • 珠海疫情最新情况厦门搜索引擎优化
  • 中国菲律宾历史战绩网站关键词优化工具
  • 西宁网站建设最好的公司哪家好优秀网站设计案例
  • 沧州做网站费用搜索引擎优化是做什么的
  • 社区网站推广方案线上运营的5个步骤
  • 湘潭学校网站建设 z磐石网络网站关键词优化教程
  • wordpress多程序用户同步汕头seo排名
  • 旅游网站 建设平台分析百度seo一本通
  • 怎么用dw做网站app开发网站
  • 昆山做网站的公司有哪些seo整站优化推广
  • 网站建设谈单情景对话青岛seo百科
  • 网站做自适应好不好网页分析报告案例
  • 大连手机自适应网站建设公司seo诊断站长
  • 有哪些好的网站十大电商代运营公司
  • 个人网页设计欣赏网站整站优化快速排名
  • 多少钱立案seo 公司
  • 医学类的网站做Google百度怎么优化排名
  • 手机网站怎样做枸橼酸西地那非片的功效与作用
  • 邯郸做wap网站的公司六六seo基础运营第三讲
  • 六安市建设银行网站seo编辑的工作内容
  • seo外包平台福州百度快照优化
  • 橙子建站广告怎么投放竞价网络推广
  • 中国公司查询网站网络公司起名
  • wordpress邮箱内容更改一键关键词优化
  • 楼市最新消息2022年房价走势seo网络推广经理
  • wordpress免费中文企业主题seo权重优化软件
  • 周口网站建设哪家好济南专业seo推广公司