string 类的实现是一个经常考的面试题,主要考察运算符的重载以及内存管理,还有可以考察面试者的代码风格。这是我自己实现的一个简单的 string 类,有需要的可以参考。代码如下:
1、mystring.h
// 自定义 MyString 类#define _CRT_SECURE_NO_WARNINGS#pragma once#include using namespace std;class MyString{public: MyString(const char* c_str = NULL); ~MyString() { delete[] m_data; this->m_data = NULL; }; // 拷贝构造函数 MyString(const MyString& str); // 拷贝复制函数 MyString& operator=(const MyString& str); // <> friend ostream& operator<>(istream& in, MyString& str); // + MyString operator+(const MyString& str); // == bool operator==(const MyString& str); // [] char operator[](int n); // 字符串长度 int length() const { return strlen(this->m_data); } // 获取 C 风格字符串 char* get_c_str() const { return this->m_data; }private: char* m_data;};
2、mystring.cpp
#include "mystring.h"MyString::MyString(const char * c_str):m_data(NULL){ if (c_str){ m_data = new char[strlen(c_str) + 1]; strcpy(this->m_data, c_str);} else{ m_data = new char[1]; *m_data = '/0';}}MyString::MyString(const MyString & str){ m_data = new char[strlen(str.m_data) + 1]; strcpy(this->m_data, str.m_data);}MyString & MyString::operator=(const MyString & str){ if (this == &str){ return *this;} delete[] m_data; m_data = new char[strlen(str.m_data) + 1]; strcpy(this->m_data, str.m_data); return *this;}MyString MyString::operator+(const MyString & str){ MyString* new_string = new MyString; if (str.m_data == NULL){ *new_string = *this;} else if (this->m_data == NULL){ *new_string = str;} else{ new_string->m_data = new char[strlen(this->m_data) + strlen(str.m_data) + 1]; strcpy(new_string->m_data, this->m_data); strcat(new_string->m_data, str.m_data);} return *new_string; delete new_string;}bool MyString::operator==(const MyString & str){ if (this->length() != str.length()) return false; return strcmp(this->m_data, str.m_data) ? false : true;}char MyString::operator[](int n){ if (n < 0 || n >= this->length()){ cout << "argument error!" << endl; return NULL;} else{ return this->m_data[n];}}ostream& operator<>(istream& in, MyString& str){ char tmp[255] = { 0 }; in >> tmp; str.m_data = new char[strlen(tmp) + 1]; strcpy(str.m_data, tmp); return in;}
3、测试函数
// 2. 字符串类测试函数void mystring_test(){ MyString str1("hello"); MyString str2(str1); MyString str3 = ", world"; MyString str4 = str1 + str3; cout << "str1: " << str1 << ", " << "str2: " << str2 << endl; cout << str2.length() << endl; cout << str2.get_c_str() << endl; cout << "str3: " << str3 << endl; cout << "str4: " << str4 << endl; cout << str4[1] << endl;}
运行结果:
str1: hello, str2: hello5hellostr3: , worldstr4: hello, worlde请按任意键继续. . .