用C++自定义String类

一、头文件

cpp 复制代码
#pragma once
#include <iostream>

/**
 * 自定义String类
 */
class String 
{
public:
	String();
	String(const char *pstr);
	String(const String &str);
	~String();
	String &operator= (const String &str);
	String &operator= (const char *pstr);

	String &operator+= (const String &str);
	String &operator+= (const char *pstr);
	
	char &operator[] (std::size_t index);
	const char &operator[] (std::size_t index) const;
	
	std::size_t size() const;
	const char* c_str() const;
	
	friend bool operator== (const String &leftStr, const String &rightStr);
	friend bool operator!= (const String &leftStr, const String &rightStr);
	
	friend bool operator< (const String &leftStr, const String &rightStr);
	friend bool operator> (const String &leftStr, const String &rightStr);
	friend bool operator<= (const String &leftStr, const String &rightStr);
	friend bool operator>= (const String &leftStr, const String &rightStr);
	
	friend std::ostream &operator<< (std::ostream &os, const String &str);
    friend std::istream &operator>> (std::istream &is, String &str);

private:
	char * _pstr;
};

String operator+(const String &thisStr, const String &otherStr);
String operator+(const String &thisStr, const char *otherpStr);
String operator+(const char *thisPstr, const String &otherStr);

二、String实现

cpp 复制代码
#include <cstring>
#include "08_MyString.hh"

using namespace std;

/**
 * 无参构造函数
*/
String::String()
: _pstr(new char[1]{0}) 
{
	strcpy(_pstr, "");	
}

/**
 * 有参构造函数
*/
String::String(const char *pstr) 
: _pstr(new char[strlen(pstr) + 1]{0})
{
	strcpy(_pstr, pstr);
}

/**
 * 拷贝构造函数
*/
String::String(const String &str)
: _pstr(new char[strlen(str._pstr) + 1]{0})
{
	strcpy(_pstr, str._pstr);
}

/**
 * 析构函数
*/
String::~String() {
	delete [] _pstr;
}

/**
 * 重载赋值运算符函数
*/
String &String::operator=(const String &str) {
	if (this != &str) { // 跳过自赋值
		delete [] _pstr;
		_pstr = new char[strlen(str._pstr) + 1]{0};
		strcpy(_pstr, str._pstr);
	} 
	return *this; 
}
String &String::operator=(const char *pstr) {
	delete [] _pstr;
	_pstr = new char[strlen(pstr) + 1]{0};
	strcpy(_pstr, pstr);
	return *this;
}

/**
 * 重载+=
*/
String &String::operator+= (const String &str) {
	size_t newLen = strlen(_pstr) + strlen(str._pstr) + 1;
	char *newStr = new char[newLen]{0};
	strcat(newStr, _pstr);
	strcat(newStr, str._pstr);
	delete [] _pstr;
	_pstr = newStr;
	return *this;
}
String &String::operator+= (const char *pstr) {
	size_t newLen = strlen(_pstr) + strlen(pstr) + 1;
	char *newStr = new char[newLen]{0};
	strcat(newStr, _pstr);
	strcat(newStr, pstr);
	delete [] _pstr;
	_pstr = newStr;
	return *this;
}

/**
 * 重载下标运算符
*/
char &String::operator[] (size_t index) {
	if (index < strlen(_pstr)) { // 未越界
		return _pstr[index];
	}else {
		static char nullchar = '\0';
		return nullchar;
	}	
}
const char &String::operator[] (size_t index) const {
	if (index < strlen(_pstr)) { // 未越界
		return _pstr[index];
	}else {
		static char nullchar = '\0';
		return nullchar;
	}	
}

/**
 * 获取字符串长度
*/
size_t String::size() const {
	return strlen(_pstr);
}

/**
 * 返回C风格字符串
*/
const char *String::c_str() const {
	return _pstr;
}

/**
 * 重载==
*/
bool operator==(const String &leftStr, const String &rightStr) {
	return strcmp(leftStr._pstr, rightStr._pstr) == 0 ? true : false;
}
/**
 * 重载!=
*/
bool operator!=(const String &leftStr, const String &rightStr) {
	return strcmp(leftStr._pstr, rightStr._pstr) != 0 ? true : false;
}
/**
 * 重载<
*/
bool operator<(const String &leftStr, const String &rightStr) {
	return strcmp(leftStr._pstr, rightStr._pstr) < 0 ? true : false;
}
/**
 * 重载>
*/
bool operator>(const String &leftStr, const String &rightStr) {
	return strcmp(leftStr._pstr, rightStr._pstr) > 0 ? true : false;
}
/**
 * 重载<=
*/
bool operator<=(const String &leftStr, const String &rightStr) {
	int res = strcmp(leftStr._pstr, rightStr._pstr); 
	return res > 0 ? false : true;
}
/**
 * 重载>=
*/
bool operator>=(const String &leftStr, const String &rightStr) {
	int res = strcmp(leftStr._pstr, rightStr._pstr); 
	return res < 0 ? false : true;
}

/**
 * 重载输出流函数
*/
ostream &operator<< (ostream &os, const String &str) {
	os << str._pstr;
	return os;
}

/**
 * 重载输入流函数
*/
istream &operator>> (istream &is, String &str) {
	char buf[4096];
	is.getline(buf, sizeof(buf));
	delete [] str._pstr;
	str._pstr = new char[strlen(buf) + 1];
	strcpy(str._pstr, buf);
	return is;
}

/**
 * 重载+
*/
String operator+(const String &thisStr, const String &otherStr) {
	String temp(thisStr.c_str());
	temp+=otherStr.c_str();
	return temp;
}
String operator+(const String &thisStr, const char *otherPstr) {
	String temp(thisStr.c_str());
	temp+=otherPstr;
	return temp;
}
String operator+(const char *thisPstr, const String &otherStr) {
	String temp(thisPstr);
	temp+=otherStr.c_str();
	return temp;
}
相关推荐
欧特克_Glodon29 分钟前
OpenCV计算机视觉开发入门与实践<七>:OpenCV 界面编程之窗口
c++·人工智能·opencv·计算机视觉
郝学胜_神的一滴34 分钟前
C++20 高级编程 002:夯实现代C++底层基本功
c++·编程语言
老赵的博客1 小时前
可维护性 可扩展性 可复用性
开发语言·c++
不正经学生2 小时前
C语言大小端字节序:内存里字节的排列顺序
c语言·开发语言·arm开发·c++·算法·c#
小则又沐风a3 小时前
负载均衡式在线OJ---------第二幕
linux·c++·后端
a3535413823 小时前
C++项目如何架构优化
java·c++·架构
键盘会跳舞3 小时前
C++:智能指针源码级深度拆解——从 RAII 思想到引用计数的内存安全体系
c++·智能指针·unique_ptr·shared_ptr·weak_ptr
SNAKEpc121384 小时前
OpenGL(十三)- Mip贴图
c语言·c++·图形渲染·贴图
会周易的程序员17 小时前
aiDgePLC — IEC61131-3 ST PLC 虚拟机调试与运行环境
c++·物联网·虚拟机·st·工业协议·iec61131·梯形图
wuminyu18 小时前
JVM利用io_uring优化堆外内存性能原理剖析
java·linux·c语言·jvm·c++