您的位置:首页 > 编程语言 > C语言/C++

string类实现

2016-03-11 17:39 295 查看
string类
写法一:
class String
{
public:
String()//构造函数,当str为空字符串时
{
_str = new char[1];
*_str = '\0';
cout << "string()" << endl;
}
String(char* str)//构造函数
:_str(new char[strlen(str + 1)])//strlen求字符串大小,不包括‘\0’,故+1留下/0空间
{
strcpy(_str, str);
cout << "构造" << endl;

}
~String()//析构函数
{
delete[]_str;//new[]要用delete[]释放
cout << "析构" << endl;

}
String(const String& str)//拷贝构造函数
:_str(new char[strlen(str._str) + 1])
{
strcpy(_str, str._str);
cout << "拷贝" << endl;
}
String& operator=(const String& str)//重载=
{
if (this != &str)//判断自赋值
{
delete[]_str;//释放原空间
_str = new char[strlen(str._str) + 1];//开辟新空间
strcpy(_str, str._str);//复制
return *this;
}
cout << "重载" << endl;

}
private:
char* _str;
};
写法二:
简化
class String
{
public:
String()//构造函数,当str为空字符串时
{
_str = new char[1];
*_str = '\0';
cout << "string()" << endl;
}
String(char* str)//构造函数
:_str(new char[strlen(str + 1)])//strlen求字符串大小,不包括‘\0’,故+1留下/0空间
{
strcpy(_str, str);
cout << "构造" << endl;

}
~String()//析构函数
{
delete[]_str;//new[]要用delete[]释放
cout << "析构" << endl;

}
String(const String& str)//拷贝构造函数
:_str(NULL)
{
String tmp(str._str);
swap(_str, tmp._str);
}
//String& operator=(const String& str)//写法一
//{
//	if (this != &str)//判断自赋值
//	{
//		String tmp(_str);
//		swap(_str, tmp._str);
//	}
//	cout << "重载" << endl;
//	return*this;
//}
String& operator=(String str)//写法二
{
swap(_str, str._str);
return *this;
}
bool operator==(const String& s)
{

}
private:
char* _str;
};
写法三:
class String
{
public:
String(char*str="")
:_str(new char[strlen(str)+5])
{
*(int*)_str = 1;
_str += 4;
strcpy(_str, str);
}
~String()
{
if (_str != NULL)
{
if (--*(int*)(_str - 4))
{
delete[](_str - 4);
}
}
}
String(const String& str)
:_str(str._str)
{
++*(int*)(_str - 4);
}
String& operator=(const String& str)
{
if (this != &str)//自赋值检查
{
if (--*(int*)(_str - 4) == 0)
{
delete[](_str - 4);
}
_str = str._str;
++*(int*)(_str - 4);
}
return *this;
}
private:
char *_str;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ string