拷贝构造函数
函数中访问object的私有数据,因兄弟类之间互为friend;strcpy会拷贝结束符,strlen不会计算结束符。
inline string::string(const string& str) {
mData = new char[strlen(str.mData) + 1];
strcpy(mData, str.mData);
}
拷贝赋值函数
如果没有自我检测判断,会申请不定大小的内存,且会发生strcpy拷贝越界。
inline string& string::operator=(const string& str) {
if (this == &str) {
return *this;
}
delete[] mData;
mData = new char[strlen(str.mData) + 1];
strcpy(mData, str.mData);
return *this
}
带指针成员的类如果没有拷贝赋值的成员函数,在类对象进行赋值操作时会发生内存泄漏;因为默认的拷贝赋值函数在对类指针成员赋值时不会释放之前指针成员所指的内存空间。
析构函数
析构函数仅释放成员指针所指的内存空间,类本身所占的内存空间new出来后,通过delete释放。
inline string::~string() {
delete[] mData;
}
{
string s1();
string s2("hellow");
string *p = new string("world");
delete p;
}