一句话总结:注意C++string与C中的字符数组的区别,C++string遇到'\0'不一定会结束输出。
#include <iostream>
#include <string.h>
using namespace std;
class String
{
friend ostream& operator<<(ostream& out, String& s);
public:
String(const char* str="");
~String();
String(const String& other);
String& operator=(const String& other);
unsigned int size() const;
private:
char* data;
unsigned int length;
};
String::String(const char* str)
{
if (NULL == str)
{
length = 0;
data = new char[1];
data[0] = '\0';
}
else
{
length = strlen(str);
data = new char[length+1];
}
if (data != NULL)
{
strcpy(data, str);
}
}
String::~String()
{
if (data != NULL)
{
delete data;
}
}
String::String(const String& other)
{
if (&other != this)
{
if (data != NULL)
{
delete data;
}
length = other.size();
data = new char[length + 1];
memcpy(data, other.data, length);
}
}
String& String::operator=(const String& other)
{
if (&other != this)
{
if (data != NULL)
{
delete data;
}
length = other.size();
data = new char[length+1];
if (data != NULL)
{
memcpy(data, other.data, length);
data[length] = '\0';
}
}
return *this;
}
ostream& operator<<(ostream& out, String& s)
{
out << s.data;
return out;
}
unsigned int String::size() const
{
return this->length;
}
int main(int argc, char const *argv[])
{
String str("hello");
cout << str <<endl;
cout << str.size() <<endl;
String str2 = "boy";
cout << str2 <<endl;
String str3 = str;
cout << str3 <<endl;
return 0;
}
zjy@ubuntu:~$ ./string
hello
5
boy
hello
zjy@ubuntu:~$