C++ 三大函数该写就要写
来源:互联网 发布:redis和mysql的结合 编辑:程序博客网 时间:2024/05/16 07:01
记得C++ 沉思录上说过,如果数据成员有指针类型的,最好把三大函数补全,不然的话容易产生浅拷贝和内存泄露。这里给出一个简单的例子。
#include <iostream>#include <vector>#include <algorithm>#include <cstring>using namespace std;class CDemo{public: CDemo():str(new char[1]) { str[0] = '\0'; cout<< "Construct"<<endl; }; CDemo(const char *s) : str(new char[strlen(s) + 1]) { strcpy(str,s); } CDemo( const CDemo & D) : str(new char [strlen(D.c_str()) + 1]) { strcpy(str,D.c_str()); } ~CDemo() { if(str != NULL) { delete [] str; str = nullptr; cout<< "Deconstruct!"<<endl; } cout<< "Deconstruct finish"<<endl; } CDemo & operator = ( CDemo CD) { swap(str, CD.str); return * this; } char *c_str() const { return str; }private: char *str;};int main(){ CDemo d1("trend micro"); CDemo d2; d2 = d1; vector<CDemo> * a1 = new vector<CDemo>(); a1->push_back(d1); cout<< "d1: "<<d1.c_str()<<endl; cout<< "a1: "<<a1->front().c_str()<<endl; strcpy(a1->front().c_str(), "change"); //如果没有拷贝构造函数,则这里会出错 cout<<a1->front().c_str()<<endl; delete a1; //如果不定义拷贝构造函数将出现push_back的时候的浅拷贝情况,析构a1的时候要 //delete 类中的str,导致str被delete两次 return 0;}
0 0
- C++ 三大函数该写就要写
- 写程序就要这种境界
- 自己动手写C语言格式化输出函数(三)
- 写一个 C 函数,该函数将给定的一个字符串转换成数字
- 【积累】C/C++中明明该用函数实现的功能,为啥非要自己写代码!
- c函数-写一个字符
- 有时间我就要写点书评
- 接下来我们就要写程序了
- 2.写一个C函数,该函数可以实现将一个整数转为任意进制的字符串输出
- 点滴系列之三:Blog我该写点什么
- 如果写了operator new就要同时写operator delete
- Item 52:写了placement new就要写placement delete
- 该程序怎么写
- 该怎么写
- 该写些什么?
- 该写点什么
- 技术文章该如何写
- QWS_MOUSE_PROTO该如何写
- Android学习 4 -> 布局结构的学习
- Windows上配置python的环境变量
- Contrail中包的类型
- open阶段的一致性检验(二)
- 杭电2015(感想总结)
- C++ 三大函数该写就要写
- png库结合zlib库使用出现的一个链接问题的解决
- ubuntu 内核编译
- 浅析C# 中object sender与EventArgs e (转)
- mysql与mysqld_safe
- 计算机启动的过程
- 正则表达式判断是否截断文本
- 随思自己的职业历程之写博客
- M3U8文件简介