C++实现String类

@TOCC++实现String类

通过C++创建一个String类,并实现String类中的相关操作

1.先对String类进行声明(为了测试方便将类的成员函数的声明与实现都放在了String.h中):

class String
{
public:
	String(const char *str=NULL);//通用构造函数
	String(const String &another);//拷贝构造函数
	~String(){}//析构函数

	String& operator=(const String &rhs);//重载赋值=函数
	String& operator+(const String& rhs);//重载+
	String& operator+=(const String& rhs);//重载+=
	String& operator++(const String& rhs);//重载++
	char& String::operator[](int n) const//重载[]
	
	friend std::ostream&  operator<<(std::ostream& os,const String &des);//重载输出<<运算符
	friend std::istream&  operator>>(std::istream& is, String &des);//重载输入>>运算符
	
	/*这两个函数在该实例中没有用
	size_t  size() const;//获取长度 size_t 为unsigned int (在默认情况下声明的整型变量都是有符号的类型(char有点特别))
	const char* c_str() const;//获取c字符串
	*/
private:
	char* m_data;//用于保存字符串首地址
	size_t length;//记录String类对象的长度
};

2.对成员函数进行实现

//String的构造函数
String::String(const char *str){
	if(!str){//如果字符串为空
		this->m_data=new char[1];
		this->m_data='\0';
	}else{//字符串非空
		this->lenght = strlen(str);
		this->m_data = new char[length+1];
		strcpy(this->m_data,str);
	}
}
//析构函数
String::~String(){
	delete[]m_date;
	this->length = 0;
}
//拷贝构造函数;这里就涉及浅拷贝与深拷贝的知识点(后期学习了再做解析)
String::String(const String &another){
	//拷贝构造的实现方法与构造函数思路大同小异,只不过构造函数传递的参数是char类型,而拷贝构造函数传递的函数类为自定义的String类。
	this->length = anothor.length;
	this->m_data = new char[length+1];
	memcpy(m_data,another.m_data,length);//进行复制
}

//重载赋值=函数
String& operator=(const String &rhs){
	//先进行对两个对象内容是否一致的判断
	if(m_data==&rhs){//例如 s1=s1;那么两者的地址肯定一致
		return *this;
	}
	delete[]m_data;
	this->length = rhs.length;//如果内容不一致
	m_date = rhs.m_date;
	return *this;	
}
//重载+
String& operator+(const String& rhs){
	//对于+运算符的重载,主要是要对两个对象进行判断,有没有为空的对象,如果没有就可以用strcat()函数将两个字符串连接
	String merge_str;//定义一个之间变量
	if(!this->m_data){//s1+s2;这里this->m_data就是指的s1中的m_data,s2就是rhs;
		merge_str.m_data=rhs.m_data;
	}else if(!rhs){
		merge_str.m_data=this->m_data;
	}else{
		size_t Total_len = this->length + rhs.length + 1;
		merger_str.m_date = new char[Total_len];
		strcpy(merger_str.m_date, this->m_date);
		strcat(merger_str.m_date, rhs.m_date);
	}
	this->m_data = merge_str.m_data;
	return *this;
}
//重载+=;其实就是先+后= s1+=s2---->s1 = s1+s2
String& operator+=(const String& rhs){
	if (this->length==0) {
		return *this=others;

	}
	else if (others.length==0) {
		return *this;
	}
	else {
		this->length += others.length;
		char* NewData = new char[length+1];
		strcpy(NewData, this->m_data);
		strcat(NewData, others.m_data);
		delete[]m_data;
		this->m_data = NewData;
		return *this;
	}
}
String& operator==(const String& rhs){
	if(this->length!=rhs.length){
		return false;
	}
	return strcmp(this->m_data,rhs.m_data)?false:true;//strcmp(s1,s2);返回两个字符串的差值,相同返回0,不同返回-1
}
//重载小标运算符
 char& String::operator[](int n) const {
	if (n>= int(this->length)) {
		return m_date[length-1];//如果下标过大就默认输出最后一个字母(length-1)最后是空格所以要减1
	}
	else {
		return m_date[n-1];
	}
}
//重载输出<<运算符
std::ostream&  operator<<(std::istream& os,const String &des){
	os<<des.m_data;
	return os;
}
//重载输出>>运算符。
//该运算符重载主要涉及的就是将键盘输入的C字符串保存,然后将其内容复制到String类对象。
std::istream&  operator>>(std::istream& is, String &des){
	//第一步接收字符串,定义一个相对较大的char类型数组
	char str[100] = {0};
	is>>str;//
	int len = strlen(str);
	des.m_data = new char[des.length+1];
	strcpy(des.m_data,str);
	return is;
}

/*
//获取长度 size_t 为unsigned int (在默认情况下声明的整型变量都是有符号的类型(char有点特别))
size_t  Srting::size() const{
	return this->length;//只需要返回所创对象的长度就可以,因为在创建对象时就会调用构造函数对length进行初始化
}
//获取c字符串
const Striing::char* c_str() const{
	return m_data;//与获取长度一样的思路,m_data就存储了对象存储数据的地址
}
*/

3.main.cpp(测试如下)

int main(){
	/*对于String类的测试---String.h*/
	String str_1("hello");
	String str_2("world");
	String str_3;
	str_3 = str_1+str_2;//这里是先调用了+然后再调用=,相当于str_1=str_1+str_2;str_3=str_1
	cout << "测试重载运算符+:str_3="<<str_3 << endl;
	cout << "str_1=" << str_1 << endl;//此时str_1存储的内容已经是helloworld了
	str_1 += str_2;
	cout << "测试重载运算符+=:str_1=" << str_1 << endl;
	cout << "测试重载运算符==:" << endl;
	if (str_1 == str_2) {cout << "yes" << endl;
	}else {cout << "no" << endl;}
	cout << "测试重载运算符[]:" << endl;
	cout << str_2[2] << "  " << str_2[3] << "  " << str_2[9] << endl;
	return 0;
}

4.测试结果如下图所示:
测试结果

这里是参考内容(根据该博主的思路写的)https://www.cnblogs.com/zhizhan/p/4876093.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的string是一个用于处理字符串的标准库。它提供了一系列成员函数和操作符重载,使得字符串的操作更加方便和高效。 C++中的string位于命名空间std中,因此在使用之前需要包含头文件< string >。 下面是一个简单的示例,展示了如何使用string来创建、初始化和操作字符串: ```cpp #include <iostream> #include <string> int main() { // 创建一个空字符串 std::string str; // 初始化字符串 std::string greeting = "Hello, world!"; // 获取字符串长度 int length = greeting.length(); std::cout << "Length: " << length << std::endl; // 连接字符串 std::string name = "Alice"; std::string message = greeting + " My name is " + name; std::cout << "Message: " << message << std::endl; // 获取子串 std::string substring = message.substr(7, 5); std::cout << "Substring: " << substring << std::endl; // 查找子串 size_t position = message.find("world"); if (position != std::string::npos) { std::cout << "Found at position: " << position << std::endl; } else { std::cout << "Not found" << std::endl; } return 0; } ``` 上述示例中,我们首先创建了一个空字符串`str`,然后使用赋值运算符将字符串"Hello, world!"赋给了变量`greeting`。接着,我们使用`length()`函数获取了字符串的长度,并使用`+`运算符将多个字符串连接起来形成新的字符串。我们还使用`substr()`函数获取了字符串的子串,并使用`find()`函数查找了子串在原字符串中的位置。 除了上述示例中的操作,string还提供了许多其他有用的成员函数和操作符重载,如插入、删除、替换、比较等。你可以参考C++的官方文档或其他相关资料来了解更多关于string的详细信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值