下边说一下拷贝拷贝构造拷贝赋值,浅拷贝,深拷贝问题
拷贝赋值
//拷贝赋值函数
inline String& String::operator=(const String& str){
if(this==&stt) //用来检测自我赋值(self assignment)
return* this;
delete[] m_data;
m_data=new char[strlen(str.m_data)+1];
strcpy(m_data,str.m_data);
return *this;
}
检测自我赋值的作用:
1.如果是自己给自己赋值,这样检测可以提高效率
2.如果没有这个检测代码,会导致错误,会导致自己先把自己删除,因为它的第一件事就是delete
拷贝构造函数
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='\';
}
}
{
String s1();
String s2("Hello");
}
如果类中有拷贝指针,需要重写拷贝构造函数(深拷贝),不重写的话直接是浅拷贝(没有真正分配内存空间,两个指针指向同一块内存)。这样会导致内存泄漏问题
使用默认拷贝构造函数就会出现下面这种情况: