C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源。简而言之就是实现string类的构造、析构、拷贝构造、赋值运算符重载
class bit {
class string {
public:
//构造函数(全缺省构造函数)
string(const char* str = "")
:_str(new char[strlen(str) + 1]) {
strcpy(_str, str);
}
//深拷贝 - 传统写法
//string s2(s1)
string(const string& s)
:_str(new char[strlen(s._str) + 1]) {
strcpy(_str, s._str);
}
//深拷贝 - 现代写法
string(const string& s):_str(nullptr) {
string tmp(s._str); //构造tmp对象
swap(_str, tmp._str);
}
// 赋值运算符---传统写法 s1 = s2
string& operator=(const string& s) {
if (this != &s) {
char* tmp = new char[strlen(s._str) + 1];
strcpy(tmp, s._str);
delete[] this;
_str = tmp;
}
return *this;
}
//赋值运算符---现代写法
string& operator=(string s) {
swap(_str, s._str);
return *this;
}
~string() {
delete[] _str;
_str = nullptr;
}
size_t size() {
return strlen(_str);
}
char& operator[](size_t i) {
return _str[i];
}
private:
char* _str;
};
static void teststring11() {
string s1("hello");
string s2(s1);
for (size_t i = 0; i < s2.size(); i++) {
cout << s2[i] << " ";
}
cout << endl;
string s3("world");
s1 = s3;
for (size_t i = 0; i < s1.size(); i++) {
cout << s1[i] << " ";
}
cout << endl;
}
};
// string s2(s1);
//现代版深拷贝:实际上就是另构造一块空间tmp(s._str)---调用构造函数(传参),
// 然后把 s2 与 tmp 交换,为了不让tmp析构的时候出现随机值,所以初始化 s2(nullptr)
// s1 = s2
//现代版赋值:实际上就是直接传值,然后交换。s是临时对象,出了作用域就要释放。
//swap是成员函数,this的类型是 string*, 相当于string对象的指针调用自己的成员函数