手写String类的构造、析构和运算符重载实现

创建一个StringClass类 存储需要用到的成员变量和 需要实现的函数
StringClass.h

#pragma once
#define EXTRA_SPACE 50
#include <iostream>

class StringClass
{
public://公有声明
	StringClass(const char* s);//构造函数-字符串初始化
	StringClass(int n, char c);//构造函数-n个字符进行初始化
	~StringClass();//析构函数

public://函数实现
	StringClass(const StringClass& str); // 拷贝构造函数
	bool operator== (const StringClass& str); //重载比较运算符==
	const StringClass& operator=(const StringClass& str); //运算符重载赋值=


private:
	int c_strlen;//字符串长度
	int c_size;//字符串空间大小
	char* p_buff;//保存字符串的首地址
};

实现类 StringClass.cpp

#include "StringClass.h"
using namespace std;

StringClass::StringClass(const char* s)//由字符串进行构造
{
	c_strlen = strlen(s);//获取到字符串的长度
	p_buff = new char[c_strlen + EXTRA_SPACE];//分配内存空间大小,多加50防止溢出问题
	memcpy(p_buff, s, c_strlen);//memcpy进行将目标字符串按照指定长度拷贝到新地址中
	c_size = c_strlen + EXTRA_SPACE;//存储新地址的空间大小
}
StringClass::StringClass(int n, char c)//构造由n个一种字符组成的字符串进行构造
{
	c_strlen = n; // 字符串实际长度
	p_buff = new char[n + EXTRA_SPACE];//开辟内存空间
	for (int i = 0; i < n; i++)//循环赋值
	{
		p_buff[i] = c;
	}
	c_size = n + EXTRA_SPACE;//内存空间大小
}

StringClass::~StringClass()
{
	if (p_buff)//释放指针
	{
		delete[] p_buff;
		p_buff = nullptr;
	}
}

StringClass::StringClass(const StringClass& str)
{
	if (*this == str)//如果一致 则不需要赋值
	{
		return;
	}

	if (p_buff)//判断p_buff是否为空 ,如果不是销毁
	{
		delete[] p_buff;
		p_buff = NULL;
	}

	//开辟空间和赋值
	c_strlen = str.c_strlen;
	p_buff = new char[str.c_strlen + EXTRA_SPACE];
	memcpy(p_buff,str.p_buff,c_strlen);
	c_size = c_strlen + EXTRA_SPACE;
}

bool StringClass::operator==(const StringClass & str)
{
	if(str.c_strlen == c_strlen && str.c_size == c_size )//先判断长度
	{
		for (int i = 0; i < c_strlen; i++)//逐个判断字符
		{
			if (p_buff[i] != str.p_buff[i])
			{
				return false;
			}
		}
		return true;
	}
	return false;
}

const StringClass & StringClass::operator=(const StringClass& str)
{
	// TODO: 在此处插入 return 语句
	if (*this == str)//如果当前this与str一致,则不用重复赋值,避免自赋值
	{
		return *this;
	}

	if (p_buff) //如果p_buff有值 则销毁
	{
		delete[] p_buff;
		p_buff = NULL;
	}

	//开辟空间赋值
	c_size = str.c_strlen + EXTRA_SPACE;
	c_strlen = str.c_strlen;
	p_buff = new char[c_size];
	memcpy(p_buff, str.p_buff, c_strlen);
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值