在C++中常见的一个面试题就是实现一个String类,在面试中我们需要实现的是String类基本的管理资源,能够拥有以下的功能:
1.能够定义变量,不能够赋值和复制等。
2.能够作为函数的参数和返回类型。
3.可以作为STL中容器的数据类型。
其次我们需要知道,string类的基本成员函数,如构造函数,拷贝构造函数,赋值操作符的重载,析构函数等。我们需要对这些函数实现String类的功能。
在实现String类,需要注意:
1.C++的String类中,可以定义一个空的字符串,该字符串只存在“\0”作为字符串结束的标志。
2.String类的拷贝构造和赋值运算符的重载时,我们需要注意的是不能只表面的进行值拷贝,也就是浅拷贝,两个类对象同时指向同一块空间,在释放的时候会对同一块空间释放多次,因此程序崩溃。
#include<iostream>
class String
{
public:
String(const char* ptr ="")
:_ptr(new char[strlen(ptr)+1])
{
strcpy(_ptr,ptr);
}
String(const String& str)
:_ptr(new char[strlen(str._ptr)+1])
{
strcpy(_ptr, str._ptr);
}
//传统写法
//String& operator=(const String& str)
//{
// if (&str != this)
// {
// delete[] _ptr;
// _ptr = new char[strlen(str._ptr) + 1];
// strcpy(_ptr, str._ptr);
// return *this;
// }
// return *this;
//}
//现代写法
String& operator=(String str)
{
std::swap(_ptr, str._ptr);
return *this;
}
~String()
{
if (_ptr != NULL)
{
delete[] _ptr;
_ptr = NULL;
}
}
size_t size()const
{
return strlen(_ptr);
}
const char* str()const
{
return _ptr;
}
private:
char* _ptr;
};
还需要注意的是,在面试中,传统写法和现代写法不要搞混,只能按照一种格式写。