手写string(1)

.h

// string.h -- fixed and augmented string class definition

#ifndef STRING1_H_
#define STRING1_H_
#include<iostream>
using std::ostream;
using std::istream;

class String
{
private:
	char* str;//pointer to string//str是一个指针
	int len;//length of string
	static const int CINLIM = 80;//cin input limit最多输入80个
public:
	//constructor and other methods
	String(const char * s);//constructor构造函数
	String();//default constructor默认构造函数
	String(const String & st);//复制构造函数
	~String();//destructor析构函数

	//overloaded operator methods重载运算符方法
	String & operator=(const String & st);  //重载=赋值运算符函数
	String & operator=(const char * s);     //重载=
	String operator+(const String & st);		//重载+
	String & operator+=(const String & st);	//重载+=
	char & operator [](int i);
	const char & operator [](int i) const;

	//overloaded operator friends
	//将比较函数作为友元,有助于将string对象与常规的C字符串进行比较
	friend bool operator<(const String & st1, const String & st2);
	friend bool operator>(const String & st1, const String & st2);
	friend bool operator==(const String & st1, const String & st2);
	friend std::ostream & operator<<(std::ostream & os, const String & st);
	friend std::istream & operator>>(std::istream & is, String & st);

};
#endif // !STRING1_H_


#pragma once

.cpp

//trngbad.cpp -- StringBad class methods
#pragma warning( disable : 4996)
#include<cstring>//string.h for some
#include"string.h"//#include<iostream>
using std::cout;
using std::cin;


//class methods
String::String(const char * s)//constructor构造函数
{
	len = std::strlen(s);//set size
	str = new char[len + 1];//allot storage分配内存
	strcpy_s(str, std::strlen(s) + 1, s);//initialize pointer4
}
String::String()//default constructor默认构造函数
{
	len = 0;
	str = new char[1];
	str[0] = '\0';
}
String::String(const String & st)//复制构造函数
{
	len = st.len;
	str = new char[len + 1];//重新分配内存
	strcpy_s(str, std::strlen(st.str) + 1, st.str);
	//把st.str指向的字符串复制给新的地址指向的空间
}
String::~String()//destructor析构函数
{
	delete[] str;//required
}

//overloaded operator methods重载运算符方法
//assign a string to a string//对象赋值
String & String::operator=(const String & st)
{
	if (this == &st)
		return *this;
	delete[] str;
	//与复制构造函数相类似
	len = st.len;
	str = new char[len + 1];
	strcpy_s(str, std::strlen(st.str) + 1, st.str);
	return *this;
}
//assign a C string to a string//字符串赋值
String & String::operator=(const char * s)
{
	delete[] str;
	//与构造函数相类似
	len = std::strlen(s);//set size
	str = new char[len + 1];//allot storage分配内存
	strcpy_s(str, std::strlen(s) + 1, s);
	return *this;
}
//注意不能加&,不能返回本地变量的地址********
String String::operator+(const String& st)		//重载+
{//新建一个长度为自身+连接字符的字符串,逐段拷贝
	String newString;
	newString.len = strlen(str) + strlen(st.str);
	newString.str = new char[newString.len + 1];
	strcpy_s(newString.str, std::strlen(str) + 1, str);
	strcat(newString.str, st.str);
	return newString;
}
//+=在原来字符串实现,所以新建char *,全部拷贝过去,再把m_data指向
String & String::operator+=(const String& st)		//重载+=
{
	len = strlen(str) + strlen(st.str);
	char *newData = new char[len + 1];
	strcpy_s(newData, strlen(str)+1, str);
	strcat(newData, st.str);
	delete[] str;
	str = newData;
	return *this;
}
//read-write char access for non-const String
char & String::operator [](int i)
{
	try{
		if (i > strlen(str))
		{
			throw "invalid index";
		}
		else
			return str[i];
	}
	catch (const char * str1)
	{
		//cout << str1 << std::endl;
		cout << str1;
	}
}
//read-only char access for const String
//仅供const String对象使用的operator []()版本,只读
const char & String::operator [](int i) const
{
	return str[i];
}

//overloaded operator friends
bool operator<(const String & st1, const String & st2)
{
	return (std::strcmp(st1.str, st2.str) < 0);
}
bool operator>(const String & st1, const String & st2)
{
	return st2 < st1;
}
bool operator==(const String & st1, const String & st2)
{
	return (std::strcmp(st1.str, st2.str) == 0);
}
//simple String output
std::ostream & operator<<(std::ostream & os, const String & st)
{
	os << st.str;
	return os;
}
//quick and dirty String input
std::istream & operator>>(std::istream & is, String & st)
{
	char temp[String::CINLIM];
	is.get(temp, String::CINLIM);
	if (is)
	{
		st = temp;
	}
	while (is && is.get() != '\n')
		continue;
	return is;
}

测试

#include"string.h"
using namespace std;
int main()
{
	//以下都为测试函数
	String s1;
	String s2 = "123";
	String s3("456");
	String s4 = s2;
	String s5(s3);
	s5 = s2;
	String s6 = s2 + s3;
	s6 += s2;
	cout << (s2 == s3) << endl;
	cout << (s4 == s2) << endl;
	cout << s6[100] << endl;//没有<< endl输出了乱码?
	//cout << endl;
	s6[8] = '5';
	cout << "s6[8]: " << s6[8] << endl;

	cout << s2;
	return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淮杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值