【面试题一的补充】C++ MyString类的封装

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:54   2991   0

一,C++ MyString类的封装


String.h:

#ifndef _STRING_H_
#define _STRING_H_
#include <iostream>
using namespace std;

class String
{
public:
 String(const char* str="");
 String(const String& other);
 String& operator=(const String& other);
 String& operator=(const char* str);

 bool operator!() const;
 char& operator[](unsigned int index);
 const char& operator[](unsigned int index) const;

 friend String operator+(const String& s1, const String& s2);
 String& operator+=(const String& other);

 friend ostream& operator<<(ostream& os, const String& str);
 friend istream& operator>>(istream& is, String& str);
 ~String(void);

 void Display() const;

private:
 String& Assign(const char* str);
 char* AllocAndCpy(const char* str);
 char* str_;
};

#endif // _STRING_H_


String.cpp:

#pragma warning(disable:4996)
#include "String.h"
#include <string.h>
//#include <iostream>
//using namespace std;

String::String(const char* str)
{
 str_ = AllocAndCpy(str);
}

String::String(const String& other)
{
 str_ = AllocAndCpy(other.str_);
}

String& String::operator=(const String& other)
{
 if (this == &other)
  return *this;

 return Assign(other.str_);
}

String& String::operator=(const char* str)
{
 return Assign(str);
}

String& String::Assign(const char* str)
{
 delete[] str_;
 str_ = AllocAndCpy(str);
 return *this;
}

bool String::operator!() const
{
 return strlen(str_) != 0;
}

char& String::operator[](unsigned int index)
{
 //return str_[index];
 //non const 版本调用 const版本

 return const_cast<char&>(static_cast<const String&>(*this)[index]);
}

const char& String::operator[](unsigned int index) const
{
 return str_[index];
}

String::~String()
{
 delete[] str_;
}

char* String::AllocAndCpy(const char* str)
{
 int len = strlen(str) + 1;
 char* newstr = new char[len];
 memset(newstr, 0, len);
 strcpy(newstr, str);

 return newstr;
}

void String::Display() const
{
 cout<<str_<<endl;
}

String operator+(const String& s1, const String& s2)
{
 //int len = strlen(s1.str_) + strlen(s2.str_) + 1;
 //char* newstr = new char[len];
 //memset(newstr, 0, len);
 //strcpy(newstr, s1.str_);
 //strcat(newstr, s2.str_);
 //
 //String tmp(newstr);
 //delete newstr;
 String str = s1;
 str += s2;
 return str;
}

String& String::operator+=(const String& other)
{
 int len = strlen(str_) + strlen(other.str_) + 1;
 char* newstr = new char[len];
 memset(newstr, 0, len);
 strcpy(newstr, str_);
 strcat(newstr, other.str_);

 delete[] str_;

 str_ = newstr;
 return *this;
}

ostream& operator<<(ostream& os, const String& str)
{
 os<<str.str_;
 return os;
}

istream& operator>>(istream& is, String& str)
{
 char tmp[1024];
 cin>>tmp;
 str = tmp;
 return is;
}


main.cpp:

#include "String.h"
#include <iostream>
using namespace std;

int main(void)
{
 String s1("abcdefg");

 char ch = s1[2];
 cout<<ch<<endl;

 s1[2] = 'A';
 s1.Display();

 const String s2("xyzabc");
 ch = s2[2];
 //s2[2] = 'M';
 s2.Display();


 String s3 = "xxx";
 String s4 = "yyy";

 String s5 = s3 + s4;
 s5.Display();

 String s6 = "aaa" + s3 + "sdfadfa" + "xxxx";
 s6.Display();

 s3+=s4;
 s3.Display();

 cout<<s3<<endl;

 String s7;
 cin>>s7;
 cout<<s7<<endl;



 return 0;
}



Makefile:

.PHONY:clean
CPP=g++
CFLAGS=-Wall -g
BIN=test
OBJS=main.o String.o
LIBS=
$(BIN):$(OBJS)
 $(CPP) $(CFLAGS) $^ -o $@ $(LIBS)
%.o:%.cpp
 $(CPP) $(CFLAGS) -c $< -o $@
clean:
 rm -f *.o $(BIN)

运行结果:

c
abAdefg
xyzabc
xxxyyy
aaaxxxsdfadfaxxxx
xxxyyy
xxxyyy
adf
adf

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP