P7 三大函数:拷贝函数、拷贝复制、析构
1、String
class String
{
public:
//Big Three
String(const char* cstr = 0);
String(const String& str);
String& operator=(const String& str);
~String();
char* get_c_str() const {return m_data;}
private:
char* m_data;
};
2、ctor和dtor(构造函数和析构函数)
inline
String::String(const char* cstr = 0)
{
if(cstr){
m_data = new char[strlen(cstr) + 1];
strcpy(m_data , cstr);
}
else{
m_data = new char[1];
*m_data = '\0';
}
}
inline
String::~String()
{
delete[] m_data;
}
s1和s2在离开作用域后自然会消亡,但是p申请了一块内存,及时离开作用域这块内存仍被占用,所以在不用p后要及时delete。
{
String s1();
String s2("Hello");
String* p = new String("hello");
delete p;
}
3、带指针的类一定要有拷贝构造和拷贝赋值
一、拷贝构造
1.浅拷贝
不进行拷贝构造(深拷贝)的后果:
仅进行了浅拷贝,b直接指向了a指向的内容(起别名),表面上实现了要求,其实不然,还会造成内存泄漏。
2.深拷贝(拷贝构造)
inline
String::String(const String& str)
{
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data , str.m_data);
}
二、拷贝赋值
inline
String& String::operator=(const String& str)
{
//检查是我赋值
if(this == &str) return *this;
//如果不进行检查,因为先杀死了自己,之后再也找不到自己,就无法成功拷贝。
delete[] m_data;//先杀死自己
m_data = new char[strlen(str.m_data) + 1];//再申请一块大小和str一样的空间
strcpy(m_data , str.m_data);//拷贝
return *this;
}
没有自我检查的不良结果:
output函数
#include <iostream>
ostream& operator<<(opstream& os , String str)
{
os << str.get_c_str();
return os;
}