字符串类设计与实现,默认构造,char*构造,拷贝构造,获得长度,重载+,+=>,<,==,!=,<<,>>
#pragma once
#include <iostream>
#include <vector>
using namespace std;
class MyString
{
public:
MyString();//default
MyString(const char* s);
MyString(const MyString &s);//copy construct
int getLength();
//重载运算符
MyString operator+(const MyString &s);
MyString& operator+=(const MyString &s);
friend bool operator>(const MyString &s1, const MyString &s2) {
const char* ps1 = &s1.vstring[0];
const char* ps2 = &s2.vstring[0];
return strcmp(ps1, ps2) > 0 ? true : false;
}
friend bool operator<(const MyString &s1, const MyString &s2) {
const char* ps1 = &s1.vstring[0];
const char* ps2 = &s2.vstring[0];
return strcmp(ps1, ps2) < 0 ? true : false;
}
friend bool operator==(const MyString &s1, const MyString &s2) {
const char* ps1 = &s1.vstring[0];
const char* ps2 = &s2.vstring[0];
return strcmp(ps1, ps2) == 0 ? true : false;
}
friend bool operator!=(const MyString &s1, const MyString &s2) {
const char* ps1 = &s1.vstring[0];
const char* ps2 = &s2.vstring[0];
return strcmp(ps1, ps2) == 0 ? false : true;
}
//重载<<,>>
friend std::ostream& operator<<(std::ostream &os, const MyString &s);
friend std::istream& operator>>(std::istream &in, MyString &s);
~MyString();//析构
private:
vector<char> vstring;
int length;
void copyTo(int num,const char* s);//将s中num个数字拷贝到vstring中
};
头文件名为MyString.h
#include "stdafx.h"
#include "MyString.h"
#include <cstring>
#include <string.h>
#include <memory>
using namespace std;
MyString::MyString() {
length = 0;
}//default
MyString::MyString(const char* s) {
length = strlen(s);
copyTo(length, s);
}
MyString::MyString(const MyString &s) {
length = s.length;
copyTo(length, &s.vstring[0]);
}//copy construct
int MyString::getLength(){
return this->length;
};
//重载运算符+,+=,>><<
MyString MyString::operator+(const MyString &s){
MyString t;
t.length = this->length + s.length;
for each (auto var in this->vstring)
{
t.vstring.push_back(var);
}
for each (auto var in s.vstring)
{
t.vstring.push_back(var);
}
return t;
}
MyString& MyString::operator+=(const MyString &s) {
*this = *this + s;
return *this;
}
//重载<<,>>
std::istream& operator>>(std::istream &in, MyString &s) {
char buf[1024];//字符缓冲区
in >> buf;
s.length = strlen(buf);
for (int i = 0; i < s.length ; ++i)
{
s.vstring.push_back(buf[i]);
}
return in;
}
std::ostream& operator<<(std::ostream &os, const MyString &s) {
for each (auto var in s.vstring)
{
os << var;
}
return os;
}
void MyString::copyTo(int num, const char* s) {
for (int i = 0; i < num; ++i)
{
vstring.push_back(*s);
++s;
}
}
MyString::~MyString()
{
}
整个设计就是模仿原生的String类的类似构造、拼接、比较、io操作
实现的时候本来想用char*来做数组的储存容器,但是由于又要new又要delete的比较麻烦,所以改用系统的顺序容器vector
难点在于重载io流的时候一定要用友元去实现,因为cin<<,cout<<
的时候是io流去调用输入输出操作
还有重载+=的时候可以用已经重载过了的+运算符,简单省事