在类中的成员变量包含指针,必须自定义拷贝构造函数、拷贝赋值函数、析构函数(?)
介绍:类A的对象a,b 而且类有指针变量,场景:没有自己定义 其实这也就是浅拷贝
当把b赋值给a,那么a对象的成员指针就会由原来构造时指的对象转变指向b的指针对象所指向的内容。(也就是简单的把b的指针地址赋值给a)
也就是A指针所指向的内容,现在有两个指针指着,相当于内容被取别名,注意啊,取别名在编程的时候很容易出问题(大佬侯捷讲的),然后就是一般取别名都使用引用,简单来说,引用不占空间,以及易读。
还有,之前a所指向的内容,现在没有指针指着,那就成了一个孤儿了,也就成了悬浮指针。出现内存泄漏。
改进:使用自己定义的拷贝构造和拷贝赋值 其实这也就是深拷贝
//简单的伪代码,就看个思想就好了
String(const char* cstr = 0){
char* t = new char[strlen(cstr.m_data) +1];
strcpy(*t, *cstr);
this.m_data = *t;
}
String(const String& str); //传入的 是类对象本身
String& operator=(const String& str); //赋值参数,且参数是类对象本身
String& String::operator= (const String& str)
{
if(this == &str) //这两行代码是有必要的
return *this; //不仅仅是效率,也是正确性,两个是指同一个东西,但释放后,怎么知道要开辟多大空间,怎么赋值?
delete [] m_data; //释放原有的内容
m_data = new char [strlen(str.m_data) + 1]; //重新开辟与要拷贝的内容同大小空间
strcpy(m_data, str.m_data); //复制
return *this;
}
~String();