题记
初略一算,学习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;
else
std::cout<<"str_2!=str_3"<<std::endl;
if (str_5 == str_3)
std::cout<<"str_5==str_3"<<std::endl;
else
std::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;
}