http://blog.csdn.net/randyjiawenjie/article/details/6709539
C++实现String类,还没有完成,待继续。
有以下注意的点:
(1)赋值操作符返回的是一个MyString&,而重载的+返回的是一个MyString。其中的原因参看《effective c++》,主要是返回引用的时候,必须返回必须在此函数之前存在的引用,因为引用是一个名字,“在我们使用之前,必须想想他代表了那个名字“。如果返回了一个局部对象的引用,那么这个函数结束后,这个引用就会指向一个不存在的对象,显然,这是走上了行为未定义的快车道。
[cpp] view plain copy
- # include <iostream>
- # include <memory>
- # include <cstring>
- using namespace std;
- class MyString {
- private:
- char *m_data;
- public:
- MyString();
- MyString(const char* ptr);
- MyString(const MyString& rhs);
- ~MyString();
- MyString& operator=(const MyString& rhs);
- MyString operator+(const MyString& rhs);
- char operator[](const unsigned int index);
- bool operator==(const MyString& rhs);
- friend ostream& operator<<(ostream& output, const MyString &rhs);
- };
- //默认的构造函数
- MyString::MyString() {
- m_data = new char[1];
- *m_data = '\0';
- }
- //使用const char* 来初始化
- MyString::MyString(const char* ptr) {
- if (NULL == ptr) {
- m_data = new char[1];
- *m_data = '\0';
- } else {
- int len = strlen(ptr);
- m_data = new char[len + 1];
- strcpy(m_data, ptr);
- }
- }
- //拷贝构造函数
- MyString::MyString(const MyString& rhs) {
- int len = strlen(rhs.m_data);
- m_data = new char[len + 1];
- strcpy(m_data, rhs.m_data);
- }
- bool MyString::operator ==(const MyString& rhs) {
- int result = strcmp(m_data, rhs.m_data);
- if (0 == result)
- return true;
- else
- return false;
- }
- //赋值操作符
- MyString& MyString::operator =(const MyString& rhs) {
- if (this != &rhs) {
- delete[] m_data;
- m_data = new char[strlen(rhs.m_data) + 1];
- strcpy(m_data, rhs.m_data);
- }
- return *this;
- }
- //重载运算符+
- MyString MyString::operator+(const MyString &rhs) {
- MyString newString;
- if (!rhs.m_data)
- newString = *this;
- else if (!m_data)
- newString = rhs;
- else {
- newString.m_data = new char[strlen(m_data) + strlen(rhs.m_data) + 1];
- strcpy(newString.m_data, m_data);
- strcat(newString.m_data, rhs.m_data);
- }
- return newString;
- }
- //重载下标运算符
- char MyString::operator [](const unsigned int index) {
- return m_data[index];
- }
- //析构函数
- MyString::~MyString() {
- delete[] m_data;
- }
- //重载<<
- ostream& operator<<(ostream& output, const MyString &rhs) {
- output << rhs.m_data;
- return output;
- }
- int main() {
- const char* p = "hello,world";
- MyString s0 = "hello,world";
- MyString s1(p);
- MyString s2 = s1;
- MyString s3;
- s3 = s1;
- MyString s4 = s3 + s1;
- bool flag(s1 == s2);
- cout << s0 << endl;
- cout << s1 << endl;
- cout << s2 << endl;
- cout << s3 << endl;
- cout << flag << endl;
- char result = s3[1];
- cout << result << endl;
- cout << s4 << endl;
- return 0;
- }
运行结果:
hello,world
hello,world
hello,world
hello,world
1
e
hello,worldhello,world