面试中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;

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值