#define _CRT_SECURE_NO_WARNINGS
#include"iostream"
using namespace std;
/*
如果要考虑深拷贝问题,必须写拷贝构造函数和重载=操作符函数
深拷贝原则:
1.判断原内存空间是否为空,不为空则释放掉
2.分配新的内存空间
3.拷贝
调用拷贝构造函数: 用对象初始化(定义的同时赋值)另一个对象时
调用重载=操作符函数: 用一个对象赋值给另一个对象(可能已经初始化,默认或者有参构造函数)时,
*/
class Test08
{
public:
Test08() {
name = NULL;
len = 0;
cout << "默认构造函数" << endl;
}
Test08(char* name) {
len = strlen(name);
this->name = (char*)malloc(sizeof(char)*(len + 1));
strcpy(this->name, name);
cout << "有参构造函数" << endl;
}
Test08(const Test08& obj) {
if (name != NULL) {
free(name);
name = NULL;
len = 0;
}
len = obj.len;
name = (char*)malloc(sizeof(char)*(len + 1));//深拷贝:手动分配内存
strcpy(name, obj.name);
cout << "拷贝构造函数" << endl;
}
~Test08() {
cout << "析构函数" << endl;
if (name != NULL)
{
free(name);
name = NULL;
len = 0;
}
}
public:
Test08& operator=(const Test08& obj) {
if (name != NULL)
{
free(name);
name = NULL;
len = 0;
}
len = obj.len;
name = (char*)malloc(sizeof(char)*(len + 1));
strcpy(name, obj.name);
cout << "重载=操作符" << endl;
return *this;
}
void printT() {
puts(name);
}
protected:
private:
char* name;
int len;
};
void objectShow08() {
Test08 t1((char*)"Hello");
//1.调用拷贝构造函数
Test08 t2 = t1;//这里不会调用t2默认构造函数
//2.调用重载=操作符函数
Test08 t3;
t3 = t1;//必须重载=操作符函数,否则析构函数出错:未加载wntdll.pdb
t1.printT();
t2.printT();
t3.printT();
//析构t3
//析构t2(拷贝构造函数)
//析构t1
}
int main() {
objectShow08();
system("pause");
return 0;
}