【C++】简单实现String类--深拷贝的普通版本和简洁版本

String 深拷贝普通版本

#define  _CRT_SECURE_NO_WARNINGS // 去除 vs下 函数不安全的警告
#ifndef  _STRING_H_
#define  _STRING_H_

#include <iostream>
using namespace std;

// 深拷贝的普通版本

class String
{
private:
	char* _data; 

public:
	// 构造函数 // 请注意这里只可以再定义或者声明的时候写默认值
	String(const char* data = '\0' );  
	String(const String& s);		  // 拷贝构造
	String& operator=(const String& s);  // 赋值运算符重载
	friend ostream& operator<<(ostream& _cout, const String& s); // 输出运算符重载
	~String(); // 析构函数

};

#endif



#include "String.h"

// String 深拷贝 普通版本
String::String(const char* data) 
{
	if (NULL == data)
	{
		_data = new char[1]; // 这里new [] 是为了匹配释放delete []
		*_data = '\0';
	}
	else
	{
		_data = new char[strlen(data) + 1];
		strcpy(_data, data);
	}
}


String::String(const String& s)
	:_data(new char[strlen(s._data) + 1])
{
	strcpy(_data, s._data);
}

String& String::operator=(const	String& s)
{
	if (this != &s)
	{
		// 开辟一段临时空间 防止new空间失败  丢失原来的数据
		char* pStr = new char[strlen(s._data) + 1];
		strcpy(pStr, s._data); // 将等号右边的内容拷贝到新开辟的空间
		delete[] _data;  // 释放原来的空间
		_data = pStr; //指向那段空间

	}
	return *this;
}

ostream& operator<<(ostream& _cout, const String& s)
{
	_cout << s._data;
	return _cout;
}


String::~String()
{
	if (NULL != _data)
	{
		delete[] _data;
		_data = NULL;
	}
};


int main()
{
	String s1("hello");
	String s2(s1);
	cout << s1 << endl;
	cout << s2 << endl;
	cout <<"------------------"<< endl;

	String s3("world");
	s3 = s1;
	cout << s3 << endl;
	cout <<"------------------"<< endl;

	return 0;
}


String 深拷贝简洁版本

头文件与前面的一样
// 构造函数
String::String(const char* data)
{
	if (NULL == data)
	{
		_data = new char[1];
		*_data = '\0';
	}
	else
	{
		_data = new char[strlen(data) + 1];
		strcpy(_data, data);
	}
}

// 拷贝构造
String::String(const String& s)
	:_data(NULL)  // 注意这里要记得置空不然会出现替换位置区域 报错
{
	String temp_str(s._data);
	std::swap(_data, temp_str._data);
}

// 赋值运算符重载

String& String::operator=(const String& s)
{
	if (this != &s)
	{
		String temp_str(s._data);
		std::swap(_data, temp_str._data);
	}
	return *this;
}

ostream& operator<<(ostream& _cout, const String& s)
{
	_cout << s._data;
	return _cout;
}

String::~String()
{
	if (NULL != _data)
	{
		delete[] _data;
		_data = NULL;
	}
};

int main()
{
	String s1("hehe");
	cout << s1 << endl;
	String s2;
	s2 = s1;
	cout << s2 << endl;

	String s3(s1);
	cout << s3 << endl;

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值