自写简化版std::string

来源:互联网 发布:ubuntu怎么扩展内存 编辑:程序博客网 时间:2024/05/21 07:52

题记

初略一算,学习C++也有那么久了,平时也写代码。但时常会因为一些基础的问题困惑,于是百度,google等。于是决定,详细的学习C++,梳理。

以下为C++的std::string 简化版,功能很简单。

参考:C++ primer 第三版

注意点:

1、在operator =(string& str), 不需要判断str是否为空。但是需要判断str是否和当前str相等。

2、返回值:在operator的大部分操作中,返回的是引用。(减少了一次拷贝:http://blog.csdn.net/piratejk/article/details/6162554)

3、以下代码在VC6.0下能够正常运行,测试通过。

#include <IOSTREAM>#include <string.h>namespace zpstring{class string{public:string();string(char* pstr);string(string& str);string(string* pstr);~string();public:string& operator=(char* pstr);string& operator=(string& str); string& operator+(string& str);bool operator==(string& str); char& operator[](int pos);public:bool empty();int length();const char* c_str();protected:private:char* m_str;int m_len;};//////////////////////////////////////////////////////string::string(){m_len = 0;m_str = NULL;}string::string(char* pstr){m_len = strlen(pstr);m_str = new char[m_len+1];strcpy(m_str, pstr);}string::string(string& str){if (str.empty())return;//if (str == this)//return;m_len = str.length();m_str = new char[m_len+1];strcpy(m_str, str.c_str());}string::string(string* pstr){if (pstr == NULL)return;if (pstr->empty())return;m_len = pstr->length();m_str = new char[m_len+1];strcpy(m_str, pstr->c_str());}string::~string(){if (m_str)delete [] m_str;}////////////////////////////////////////////////////////////string& string::operator=(char*pstr){if (pstr){delete [] m_str;m_len =strlen(pstr);m_str = new char[m_len+1];strcpy(m_str, pstr);}else{m_len = 0;delete [] m_str;m_str = NULL;}return *this;}string& string::operator=(string& str){if (this == &str)return* this;if (m_str)delete [] m_str;m_len = str.length();m_str = new char[m_len+1];strcpy(m_str, str.c_str());return *this;}string& string::operator+(string& str){if (str.empty())return *this;char* ptmp = new char[m_len+str.length()+1];strcpy(ptmp, m_str);strcat(ptmp, m_str);delete []m_str;m_str = ptmp;return *this;}bool string::operator==(string& str){if (strcmp(m_str, str.c_str())==0)return true;return false;}char& string::operator[](int pos){if (pos<=m_len)return m_str[pos];else return m_str[m_len];}////////////////////////////////////////////////////////////inline bool string::empty(){return m_len<=0;}inline int string::length(){return m_len;}inline const char* string::c_str(){return m_str;}}int main(void){zpstring::string str_1;zpstring::string str_2("test");zpstring::string str_3(str_2);zpstring::string str_4(&str_3);str_1 = "hello";std::cout<<"str_1 val:"<<str_1.c_str()<<std::endl;std::cout<<"str_1[4]"<<str_1[4]<<" str_1[8]"<<str_1[8]<<std::endl;str_1 = str_2;std::cout<<"str_1 val:"<<str_1.c_str()<<std::endl;zpstring::string str_5=str_1+str_2;std::cout<<"str_1 val:"<<str_5.c_str()<<std::endl;if (str_2 == str_3)std::cout<<"str_2==str_3"<<std::endl;elsestd::cout<<"str_2!=str_3"<<std::endl;if (str_5 == str_3)std::cout<<"str_5==str_3"<<std::endl;elsestd::cout<<"str_5!=str_3"<<std::endl;std::cout<<"str_2 val:"<<str_2.c_str()<<" len:"<<str_2.length()<<std::endl;std::cout<<"str_3 val:"<<str_3.c_str()<<" len:"<<str_2.length()<<std::endl;std::cout<<"str_4 val:"<<str_4.c_str()<<" len:"<<str_2.length()<<std::endl;std::cin.get();return 0;}


0 0
原创粉丝点击