面试中string类的正确写法
Posted 两片空白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试中string类的正确写法相关的知识,希望对你有一定的参考价值。
C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源。主要是完成string类构造函数,析构函数,拷贝构造函数和赋值操作符重载函数的编写。
注意:拷贝构造函数和赋值操作符函数涉及深浅拷贝问题,这里要用到深拷贝。浅拷贝是按字节进行拷贝。两对象字符指针指向同一块空间,在两对象析构时,同一块空间释放两次,导致程序奔溃。
深拷贝是在对象再开一块空间,将值拷贝过去,再让新对象的指针指向新开辟的空间。注意:赋值操作符重载时,要释放原来空间,再指向新空间,避免内存泄漏。
传统写法:需要在堆上重新开辟空间,在将值拷贝,将原来空间释放,再指向新空间。
现代写法:创建一个临时对象,让它去做这样的事,再直接跟他交换就好了。
#include<iostream>
#include<assert.h>
#include<Windows.h>
#pragma warning(disable:4996)
using namespace std;
class String{
public:
//构造函数
String(const char *str = "")
:_str(new char[strlen(str)+1])
{
strcpy(_str, str);
}
//拷贝构造函数
String(const String& s)
//要初始化为空,不然是随机值(野指针),交换到tmp后出作用域析构,程序奔溃
:_str(nullptr)
{
String tmp(s._str);
swap(_str, tmp._str);
}
//析构函数
~String(){
delete[] _str;
_str = nullptr;
}
//赋值操作符重载函数
String& operator=(const String& s){
String tmp(s._str);
swap(_str, tmp._str);
return *this;
}
//传值,调用拷贝构造函数,相当于创建了一个临时变量
//String& operator=(String s){
// swap(_str, s._str);
// return *this;
//}
size_t size(){
return strlen(_str);
}
char& operator[](size_t pos){
assert(pos < size());
return _str[pos];
}
private:
char *_str;
};
以上是关于面试中string类的正确写法的主要内容,如果未能解决你的问题,请参考以下文章
C语言面试题C++中String类引用计数器的浅拷贝写法与深拷贝写法
C++初阶:string类string类 | 浅拷贝和深拷贝(传统写法和现代写法) | string类的模拟实现
C++初阶:STL —— stringstring类 | 浅拷贝和深拷贝(传统写法和现代写法) | string类的模拟实现
C++初阶:STL —— stringstring类 | 浅拷贝和深拷贝(传统写法和现代写法) | string类的模拟实现