面试中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类的模拟实现

C++:常见面试题String类的写法

string类(c++)