【面试题一的补充】C++ MyString类的封装
2013-11-30 13:40
218 查看
一,C++ MyString类的封装
String.h:
String.cpp:
main.cpp:
Makefile:
运行结果:
c
abAdefg
xyzabc
xxxyyy
aaaxxxsdfadfaxxxx
xxxyyy
xxxyyy
adf
adf
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
相关文章推荐
- 【面试题001-补充】C++ MyString类的封装
- 面试题--C++基础篇(补充)
- C++面试题之写一个在一个字符串中寻找一个子串第一个位置的函数
- C++面试题(附答案)
- 【C语言】【面试题】C++中String类浅拷贝,深拷贝的传统写法与现代写法
- c++面试题总结(2)
- C++之封装和继承初识
- C++封装EventSelect
- Qt c/C++ 混合编程,windows下的网络编程--udp封装(一)
- 二分搜索面试题C++
- C++面试题收集
- c/c++面试题(3)
- C++面试题
- C/C++程序员应聘常见面试题深入剖析(3)
- C++面试题总结
- C++多态性(待补充)
- C/C++求职者必备的20道面试题
- C++面试题解答 (一)
- C/C++面试题1
- C/C++面试题精选