模仿c++ string库 写一个自己的字符串库(学习记录下)

chenweimin 1月前 ⋅ 245 阅读

编写String.h头文件

/*模仿c++中 string库 编写一个自己的string字符串*/
#include <iostream>
using namespace std;
class String {
	/*重写<<输出符号友元函数*/
	friend  ostream& operator<<(ostream& cout, String& out);
	/*重写>>输入符号友元函数*/
	friend istream& operator>>(istream& cin, String& str);
public:
	/*构造函数*/
	String(const char* str);
	/*析构函数*/
	~String();
	/*拷贝构造函数*/
	String(const String& souce);
	/*重写[]运算符*/
	char& operator[](int index);
private:
	/*存储字符串数组指针*/
	char* value;
	/*字符串长度(不包括\0)*/
	int len;
};

编写实现文件String.cpp

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include "String.h"
using namespace std;

/*构造函数*/
String::String(const char* str) {
	//在堆区开辟空间
	this->value = new char[strlen(str) + 1];
	//拷贝内容
	strcpy(this->value, str);
	//设置长度
	this->len = strlen(str);
}

/*析构函数*/
String::~String() {
	if (this->value) {
		delete[] this->value;
		this->value = NULL;
	}
}

/*拷贝构造函数*/
String::String(const String& souce) {
	//在堆区分配内存
	this->value = new char[strlen(souce.value) + 1];
	//赋值
	strcpy(this->value, souce.value);
	this->len = souce.len;
}

/*重写<<输出符号*/
ostream& operator<<(ostream& cout, String& str)
{
	cout << str.value;
	return cout;
}

/*重写>>输入符号*/
istream& operator>>(istream& cin, String& str) {
	//清空原来堆区的数据
	if (str.value) {
		delete[] str.value;
		str.value = NULL;
	}
	//接收输入数据
	char buf[1024] = { 0 };
	cin >> buf;
	//计算字符串大小在堆区开辟空间
	str.value = new char[strlen(buf) + 1];
	//赋值
	strcpy(str.value, buf);
	str.len = strlen(buf);
	return cin;
}
/*重写[]运算符*/
char& String::operator[](int index) {

	return (this->value)[index];
}

编写测试文件main.cpp

#pragma once
#include "String.h"
using namespace std;

int main() {
	String s = "abc";
	String s1 = "def";
	String s2 = s1;
	cout << s << endl;
	cout << s1 << endl;
	cout << s2 << endl;
	//cout << "请输入给字符串赋值" << endl;
	//cin >> s2;
	//cout << "您输入的字符串的值为:"<<s2<< endl;

	cout << s2[0] << endl;
	s2[0] = 'c';
	cout << s2 << endl;
	return 0;
}

全部评论: 0

    我有话说: