/*若使用浅拷贝,两个对象的data指针指向同一块内存空间,当对象析构的时候,会释放两次同一个地址的内存,出现程序coredump
解决方法1:重写拷贝构造函数,当用一个对象初始化另外一个对象时,会调用拷贝构造函数,在拷贝构造函数内执行深拷贝
############################################################################################################################
方法1只是解决了使用一个对象初始化另外一个对象时的浅拷贝问题,如果出现以下情况,还是会引起coredump 所以需要重载等号操作符
MyStr str1("asdfgh");
MyStr str3("sda");
str3 = str1;
############################################################################################################################
若想实现连等操作,需要返回该对象,刚好符合等号的左操作数,实现链式编程
*/
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
//字符串类
class MyStr
{
friend ostream & operator<<(ostream &out, MyStr& str);//友元函数
public:
//构造函数
MyStr(char *data)
{
int len = strlen(data);
this->len = len;
this->data = new char[len + 1]; //重新分配内存
for (int i = 0; i<len; i++)
{
this->data[i] = data[i];//一个一个复制
}
this->data[len] = 0;
}
//拷贝构造函数
MyStr(MyStr& s1)
{
this->len = s1.len;
this->data = new char[s1.len+1];
for (int i = 0; i < s1.len; i++)
{
this->data[i] = s1.data[i];
}
this->data[s1.len] = '\0';
}
//析构函数
~MyStr()
{
if (this->data != NULL)
{
delete[] data;
this->len = 0;
this->data = NULL;
}
}
//重载等号操作符
MyStr& operator=(MyStr &str)
{
this->len = str.len;
this->data = new char[str.len+1];
for (int i = 0; i < str.len; i++)
{
this->data[i] = str.data[i];
}
this->data[str.len]='\0';
return *this;
}
private:
int len;//字符串长度
char* data;//字符串
public:
void print()
{
cout << "字符串:" << this->data << ",长度:" << this->len << endl;
}
};
//重载<<操作符(需使用全局函数法重载)
ostream & operator<<(ostream &out,MyStr& str)
{
out << "data:" << str.data << ",len:" << str.len<<endl;
return out;
}
int main()
{
MyStr str1("asdfgh");
str1.print();
MyStr str2 = str1;
str2.print();
MyStr str3("sda");
str3 = str1;
str3.print();
MyStr str4("sda");
MyStr str5("sda");
MyStr str6("sda");
str4 = str5 = str6 = str1;
cout << str4 << str5 << str6;
system("pause");
return 0;
}