String类简单实现
String类负责对字符串的存储和处理,可以用char*、字符数组等来表示,但最好还是用STL中的string类型。在C++中,string类型的头文件为#include<string>,其中,'string.h'和'cstring'都不是string类的头文件。这两个头文件主要定义C风格的字符串操作方法,比如说,strlen(),strcpy()等。'string.h'是C风格的头文件格式,’cstring‘是C++风格头文件,作用和'string.h'一样,目的是为了和C兼容。String类的实现如下:
class String {
public:
String(const char* str = NULL);//构造函数
String(const String& other);//拷贝构造函数
~String();//析构函数
String& operator =(const String& other);//赋值函数
String& operator +(const String& other);//字符串连接
bool operator ==(const String& other);//判断字符串是否相等
int getLength();
private:
char* data;
};
其中,各成员函数实现如下:
String::String(const char* str) {
if (str == NULL) {
data = new char[1];
*data = '\0';
}
else {
int length = strlen(str);
data = new char[length + 1];
strcpy(data, str);
}
}
String::String(const String& other) {
if (!other.data) {
data = 0;
}
data = new char[strlen(other.data) + 1];
strcpy(data, other.data);
}
String::~String() {
if (data) {
delete[] data;
data = 0;
}
}
String& String::operator =(const String& other) {
if (this == &other) {
return *this;
}
else {
delete[] data;
if (!other.data) {
data = 0;
}
else {
data = new char[strlen(other.data) + 1];
strcpy(data, other.data);
}
return *this;
}
}
String& String::operator+(const String& other) {
String newString;
if (!other.data) {
newString = *this;
}
else if (!data) {
newString = other;
}
else {
newString.data = new char[strlen(data) + strlen(other.data) + 1];
strcpy(newString.data, data);
strcat(newString.data, other.data);
}
return newString;
}
bool String::operator==(const String& other) {
if (strlen(data) != strlen(other.data)) return false;
else {
return strcmp(data, other.data) ? false : true;
}
}
int String::getLength() {
return strlen(data);
}
c++字符串和c字符串的转换
c++提供的转换为c字符串的函数有:data()、c_str()和copy(),其中,data()以字符数组形式返回字符串内容,末尾没有'\0',c_str()同样返回字符数组,但是以'\0'结尾。copy()是把字符串的内容写入既有的c_string或者字符数组中。
对于c_str(),调用它时会产生一个const char*指针,它的使用例子如下:
int main(){
string str = "piaopiao9393"
const char* cstr = str.c_str();
cout<<cstr<<endl;
str = "9393piaopiao"
cout<<cstr<<endl;
return 0;
}
这两次cstr的输出分别为'piaopiao9393'和'9393piaopiao',就是说,使用c_str()方法,当我改变str的值时,cstr的值也会跟着改变。为了防止这种情况发生,可以考虑先把数据复制出来,如下:
int main(){
string str = "piaopiao9393";
char* cstr = new char[81];
strncpy(cstr,str.c_str(),str.size());
cout<<cstr<<endl;
str = "9393piaopiao";
cout<<cstr<<endl;
}
上面这段代码,cstr的输出分别为'piaopiao9393'和'piaopiao9393'。