C++ 三大函数该写就要写
2015-06-11 19:07
555 查看
记得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;
}
#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;
}
相关文章推荐
- leetcode 日经贴,Cpp code -Basic Calculator
- 简单栈的c语言实现
- 对VC++下Debug模式和Release模式的简要分析
- LeetCode 之 Pascal's Triangle — C++ 实现
- LeetCode 之 Merge Sorted Array — C++ 实现
- 行参和实参的区别 原文说的是c++的 借鉴一下吧
- 行参和实参的区别 原文说的是c++的 借鉴一下吧
- C++学习笔记(3) 数组
- 类型转换
- 提高C++程序运行效率的10个简单方法
- [转]C语言之单向链表的创建插入删除等功能
- Win7下vc++6.0打开项目Microsoft(R) Developer Studio以及Unable to register this add-in because its DLLRegist
- 浅谈C++中指针和引用的区别
- C++ 深入理解 字符串 和 数组
- 黑马程序员-C语言算法练习
- 指向指针的指针,彻底搞定C++指针
- C/C++中的预编译指令
- MFC完全自绘Tab控件,支持图片背景
- c++学习笔记(4.c++中新的关键字)
- C++中lower_bound函数和upper_bound函数