一、源码链接
二、实现代码
// string.h
#ifndef __STRING_H_
#define __STRING_H_
#include <iostream>
#include <string.h>
using namespace std;
class String
{
public:
String();
String(int n, char c);
String(const char* source);
String(const String& s);
~String();
public:
String& operator=(const char* s);
String& operator=(const String& s);
char& operator[](int i);
const char& operator[](int i)const;
String& operator+=(const String& s);
String& operator+=(const char *s);
friend ostream& operator<<(ostream& out, const String& s);
friend istream& operator>>(istream& in, String& s);
friend bool operator<(const String& s1, const String& s2);
friend bool operator>(const String& s1, const String& s2);
friend bool operator<=(const String& s1, const String& s2);
friend bool operator>=(const String& s1, const String& s2);
friend bool operator==(const String& s1, const String& s2);
friend bool operator!=(const String& s1, const String& s2);
public:
char* getData() { return data; }
int length() { return size; }
private:
int size;
char *data;
};
#endif // __STRING_H_
// string.cpp
#include "String.h"
String::String()
{
data = new char[1];
*data = '\0';
size = 0;
}
String::String(int n, char c)
{
data = new char[n + 1];
char *temp = data;
while(n--)
*temp++ = c;
*temp = '\0';
size = n;
}
String::String(const char * source)
{
if(source == NULL)
{
data = new char[1];
*data = '\0';
size = 0;
return;
}
size = strlen(source);
data = new char[size + 1];
char *temp = data;
while(*source != '\0')
*temp++ = *source++;
*temp = '\0';
}
String::String(const String& s)
{
if(s.size == 0)
{
data = new char[1];
*data='\0';
size = 0;
return;
}
data = new char[s.size + 1];
char *temp1 = data;
char *temp2 = s.data;
while(*temp2 != '\0')
*temp1++ = *temp2++;
*temp1= '\0';
size = s.size;
}
String::~String()
{
if(data)
{
delete[] data;
data = nullptr;
size = 0;
}
}
String& String::operator=(const char* s)
{
if(data)
{
delete[] data;
}
if(s == NULL)
{
data = new char[1];
*data = '\0';
size = 0;
}
size = strlen(s);
data = new char[size + 1];
char *temp = data;
while(*s != '\0')
*temp++ = *s++;
*temp = '\0';
return *this;
}
String& String::operator=(const String& s)
{
if(this == &s)
return *this;
if(data)
delete[] data;
size = s.size;
data = new char[size + 1];
char *temp1 = s.data;
char *temp2 = data;
while(*temp1 != '\0')
*temp2++ = *temp1++;
*temp2 = '\0';
return *this;
}
char& String::operator[](int i)
{
return data[i];
}
const char& String::operator[](int i)const
{
return data[i];
}
String& String::operator+=(const String& s)
{
if(s.size == 0)
return *this;
char *temp = new char[size + s.size + 1];
memcpy(temp, data, size);
memcpy(temp + size, s.data, s.size);
*(temp + size + s.size + 1) = '\0';
if(data != NULL)
delete[] data;
data = temp;
size += s.size;
return *this;
}
String& String::operator+=(const char *s)
{
if(s == NULL || (strlen(s) == 0))
return *this;
char *temp = new char[size + strlen(s) + 1];
memcpy(temp, data, size);
memcpy(temp + size, s, strlen(s));
*(temp + size + strlen(s) + 1) = '\0';
if(data != NULL)
delete[] data;
data = temp;
size += strlen(s);
return *this;
}
ostream& operator<<(ostream& out, const String& s)
{
out << s.data;
return out;
}
istream& operator>>(istream& in, String& s)
{
char p[50];
in.getline(p, 50);
s = p; // 调用赋值运算符
return in;
}
bool operator<(const String& s1, const String& s2)
{
int i = 0;
while(s1[i] == s2[i] && s1[i] != '\0' && s2[i] != '\0')
i++;
return (s1[i] < s2[i]) ? true : false;
}
bool operator>(const String& s1, const String& s2)
{
return !(s1 < s2);
}
bool operator<=(const String& s1, const String& s2)
{
int i = 0;
while(s1[i] == s2[i] && s1[i] != '\0' && s2[i] != '\0')
i++;
return (s1[i] < s2[i] || (i == s1.size)) ? true : false;
}
bool operator>=(const String& s1, const String& s2)
{
return !(s1 < s2);
}
bool operator==(const String& s1, const String& s2)
{
char *temp1 = s1.data;
char *temp2 = s2.data;
if(s1.size != s2.size)
return false;
while((*temp1++ == *temp2++) && (*temp1 != '\0') && (*temp2 != '\0'));
if(*temp1 == '\0')
return true;
}
bool operator!=(const String& s1, const String& s2)
{
return !(s1 == s2);
}
三、测试代码
// main.cpp
#include "String.h"
using namespace std;
int main()
{
std::cout << "********构造函数********" << std::endl;
String s1;
std::cout << "s1:" << s1 << std::endl;
String s2(10, 'a');
std::cout << "s2:" << s2 << std::endl;
String s3("HelloWorld");
std::cout << "s3:" << s3 << std::endl << std::endl;
std::cout << "********拷贝构造********" << std::endl;
String s4(s2);
std::cout << "s4:" << s4 << std::endl;
String s5 = s3;
std::cout << "s5:" << s5 << std::endl << std::endl;
std::cout << "********=运算符********" << std::endl;
s4 = "bbb";
std::cout << "s4:" << s4 << std::endl;
s4 = s5;
std::cout << "s4:" << s4 << std::endl << std::endl;
std::cout << "********下标运算符********" << std::endl;
std::cout <<"s4[0]: " <<s4[0] << std::endl;
std::cout <<"s4[1]: " <<s4[1] << std::endl;
std::cout <<"s4[9]: " <<s4[9] << std::endl << std::endl;
std::cout << "********+=运算符********" << std::endl;
s4 += s5;
std::cout << "s4:" << s4 << std::endl;
s4 += ",C++";
std::cout << "s4:" << s4 << std::endl;
s5 += s4;
std::cout << "s5:" << s5 << std::endl;
s5 += ",C";
std::cout << "s5:" << s5 << std::endl << std::endl;
std::cout << "********>、<、>=、<=运算符********" << std::endl;
String s6("abc");
String s7("abcd");
String s8("axc");
std::cout << "s6 > s7: " << (s6 > s7) <<std::endl;
std::cout << "s6 < s7: " << (s6 < s7) <<std::endl;
std::cout << "s6 >= s7: " << (s6 >= s7) <<std::endl;
std::cout << "s6 <= s7: " << (s6 <= s7) <<std::endl;
std::cout << "s6 > s8: " << (s6 > s8) <<std::endl;
std::cout << "s6 < s8: " << (s6 < s8) <<std::endl;
std::cout << "s6 >= s8: " << (s6 >= s8) <<std::endl;
std::cout << "s6 <= s8: " << (s6 <= s8) <<std::endl <<std::endl;
std::cout << "********==、!=运算符********" << std::endl;
String s9("abc");
String s10("axcd");
String s11("abcd");
String s12("abcd");
std::cout << "s9 == s10: " << (s9 == s10) <<std::endl;
std::cout << "s9 != s10: " << (s9 != s10) <<std::endl;
std::cout << "s9 == s11: " << (s9 == s11) <<std::endl;
std::cout << "s9 != s11: " << (s9 != s11) <<std::endl;
std::cout << "s11 == s12: " << (s11 == s12) <<std::endl;
std::cout << "s11 != s12: " << (s11 != s12) <<std::endl <<std::endl;
std::cout << "********>>运算符********" << std::endl;
String s13;
std::cout << "Please write to s13: ";
cin >> s13;
std::cout << "s13: " << s13 <<std::endl;
return 0;
}
四、运行效果如下