您的位置:首页 > 其它

string类

2015-12-14 17:29 197 查看
string类的实现是笔试面试常见的题型之一,考察的关键点是函数的返回值和函数的参数,这个是很关键的,如果仅仅是简单的以为把函数里面的逻辑写出来是远远不够的。另外一个关键就是深拷贝和浅拷贝和内存的申请和释放。

1、下面直接给出基本的类定义:

class MyString
{
public:
MyString();
MyString(const char *str);
MyString(const MyString& rhs);
~MyString();
MyString& operator=(const MyString& rhs);
MyString operator+(const MyString& rhs);
char operator[](const unsigned int index);
bool operator==(const MyString& rhs);
private:
char *_str;
};


2、函数的实现

2.1、默认构造函数

MyString::MyString()
{
_str = new char[1];  //申请一个字节的空间,放入'\0'
*_str = '\0';
}


2.2、常用构造函数

//使用const char* str来初始化
MyString::MyString(const char* str)
{
if(NULL == str)
{
_str = new char[1];
*_str = '\0';
}else
{
int len = strlen(str);
_str = new char[len+1];
snprintf(_str,len,"%s",str); //放弃使用strcpy
}

}


2.3、拷贝构造函数

MyString::MyString(const MyString& rhs)
{
int len = strlen(rhs._str);
_str = new char[len+1];
snprintf(_str,len,"%s",str); //放弃使用strcpy
}


2.4、析构函数

MyString::~MyString()
{
if(_str)
{
delete[] _str;
_str = NULL;
}
}


2.5、赋值操作符

MyString::MyString& operator=(const String& rhs)
{
if (this != &rhs)
{
delete[] _str;

_str = new char[strlen(rhs._str) + 1];
strcpy(_str, rhs._str);
}

return *this;
}


2.6、+操作符重载

MyString MyString::operator+(const MyString& rhs)
{
MyString newString;
if( !rhs._str)
{
newString = *this;
}else if( !_str)
{
newString = rhs;
}else
{
newString._str = new char[strlen(_str)+strlen(rhs._str)+1];
snprintf(_str,len,"%s",_str);
strcat(newString,_str,rhs._str);
}

return newString;
}


2.7、重载[]

char MyString::operator[](const unsigned int index)
{
return _str[index];
}


2.8、判断相等

bool MyString::operator==(const MyString& rhs)
{
return 0 == strcmp(_str,rhs._str);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  string class