传统写法:
#include<iostream>
#include<stdlib.h>
using namespace std;
class String
{
public:
//构造函数是用系统传入的str去构造_STR
String(char* str = "")
:_str( new char[strlen(str) + 1])
{
strcpy(_str, str);
}
//拷贝构造是将已存在的String s 类中的_str去构造_str。
String(String& s)
:_str(new char[strlen(s._str) + 1])
{
strcpy(_str, s._str);
}
//复制运算符重载已存在的String s 类中的_str去赋值给tmp。
//String& operator = (const String& s)
//{
// if (&s != this)
// {
// delete[] _str;
// char* tmp = new char[strlen(s._str) + 1];
// strcpy(tmp, s._str);
// }
// return *this;
//}
String& operator = (const String& s)
{
if (&s != this)
{
char* tmp = new char[strlen(s._str) + 1];
strcpy(tmp, s._str);
//先释放后指向,否则_str无人管理会内存泄漏
delete[] _str;
_str = tmp;
}
return *this;
}
~String()
{
if (_str)
{
delete[] _str;
}
}
private:
char* _str;
};
void Test()
{
String s1("s1");
String s2(s1);
}
int main()
{
Test();
system("pause");
}
现代写法:
#include<iostream>
#include<stdlib.h>
using namespace std;
class String
{
public:
String(char* str = "")
:_str(new char[strlen(str) + 1])
{
strcpy(_str, str);
}
String(const String& s)
:_str(NULL)
{
String tmp = s._str;
swap(tmp._str, _str);
}
String& operator = (const String& s)
{
if (&s != this)
{
String tmp = s._str;
swap(tmp._str, _str);
}
return *this;
}
~String()
{
if (_str)
{
delete[] _str;
}
}
private:
char* _str;
};
void Test()
{
String s1("s1");
String s2(s1);
}
int main()
{
Test();
system("pause");
}
本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1745773