深浅拷贝和赋值

xiaoxiao2021-02-28  34

#include<iostream> using namespace std; class String //私有成员变量中有指针类型,一般要编辑拷贝构造函数和赋值函数,预防浅拷贝和浅赋值 { public: //构造函数 String(const char *str = "") { if(*str == NULL)//为空不等价于为‘\0’ { data = (char*)malloc(sizeof(char)); data[0] = '\0'; } else { data = (char*)malloc(sizeof(char)*(strlen(str)+1)); strcpy(data,str); } } //赋值函数(深赋值) String& operator=(const String &s)//使用引用赋值可以节省开辟新空间,提高效率 { if(this != &s)//判断自赋值 { free(data);//释放原有空间,避免内存泄漏 data = NULL;//赋空 data = (char*)malloc(sizeof(char)*(strlen(s.data)+1));//开辟空间(含\0) strcpy(data,s.data);//拷贝 } return *this;//返回自身对象 } //浅拷贝,只改变指针指向,析构的时候会把同一空间析构多次,造成运行错误 /*String(const String &s) { data = s.data; }*/ //深拷贝,开辟新空间并改变指针指向 String(const String &s) { data = (char*)malloc(sizeof(char)*(strlen(s.data)+1)); strcpy(data,s.data); } //析构函数 ~String () { free(data); data = NULL; } private: char *data; }; void main() { char *str = NULL; String s1; String s2(s1); String s3; s3 = s2; }
转载请注明原文地址: https://www.6miu.com/read-2626249.html

最新回复(0)