C++仿string实现的String方法
String.h
#include <iostream>
using namespace std;
class String {
friend ostream &operator<<(ostream &,const String &);
private:
char *m_cstring;
public:
String(const char *cstring){};
// 拷贝构造
String(const String &string);
~String();
// 重载等号运算符,接收的是C语言字符串
String &operator=(const char *cstring);
// 重载等号运算符,接收的是String类型的字符串
String &operator=(const String &string);
};
String.cpp
#include <iostream>
#include "String.h"
using namespace std;
String::String(const char *cstring) {
if(!cstring)return;
this->m_cstring = new char[strlen(cstring) + 1]{};
strcpy(this->m_cstring,cstring);
}
// 拷贝构造
String::String(const String &string) {
*this = string.m_cstring;
}
String::~String(){
if(!this->m_cstring) return;
delete[] this->m_cstring;
this->m_cstring = NULL;
析构时也可以写为operator = (NULL)或者*this = (NULL)等价于(*this).operator = (NULL);等价于this->operator = (NULL)
}
String::String &operator=(const char *cstring){
// 大家都指向同一个堆空间就返回自己
if(this->m_cstring == cstring) return *this;
// 释放旧的字符串
if(this->m_cstring){
delete[] this->m_cstring;
this->m_cstring = NULL;
}
// 指向新的字符串
if(cstring){
this->m_cstring = new char[strlen(cstring) + 1]{};
strcpy(this->m_cstring,cstring);
}
return *this;
};
// 重载等号运算符,接收的是String类型的字符串
String::String &operator=(const String &string){
return operator=(string.m_cstring);
}
ostream &operator<<(ostream &cout,const String &string){
if (!string.m_cstring) return cout;
return cout << string.m_cstring;
}
main.cpp
#include <iostream>
using namespace std;
int main() {
// "123" -> const char *
String str1 = "123";
// 在栈空间
char name[] = "123";
String str = name;
cout << str << endl;
cout << str1 << endl;
{
// 重载等号运算符,接收的是C语言字符串
String str4 = "3333";
str4 = "555";
cout << str << endl;
}
{
// 重载等号运算符,接收的是String类型的字符串
String str5 = "5555";
String str6 = "6666";
str5 = str6;
cout << str5 <<endl;
}
{
// 重载等号运算符,指向同一个堆空间
String str7 = "5555";
str7 = str7;
cout << str5 <<endl;
}
{
// 拷贝构造
String str1 = "1111";
String str2 = str1;
}
getchar();
return 0;
}