String类的实现


#include <iostream>
using namespace std;

/*String类的实现*/
/*功能函数*/
/*
1.重载<<运算符
2.重载>>运算符
3.默认构造函数
4.复制构造函数
5.赋值构造函数
6.operator+
7.operator+=
8.operator==
9.operator[](const和非const)
10.析构函数
*/

class String{
	friend ostream &operator<<(ostream &, String &);  
	friend istream &operator>>(istream &, String &);
public:
	String(const char *str = NULL);
	String(const String &other);
	String& operator=(const String &other);
	String operator+(const String &other);
	bool operator==(const String &other);
	char &operator[](unsigned int i);
private:
	char *m_data;
};


String::String(const char* str){
	if (str == NULL){
		m_data = new char[1];
		*m_data = '\0';
	}
	else{
		int length = strlen(str);
		m_data = new char[length + 1];
		strcpy(m_data, str);
	}
}

String::String(const String &other){
	if (other.m_data == NULL){
		m_data = NULL;
	}
	else{
		int length = strlen(other.m_data);
		m_data = new char[length + 1];
		strcpy(m_data, other.m_data);
	}
}

String& String::operator=(const String &other){
	if (this != &other){
		delete[] m_data;
		if (other.m_data == NULL){
			m_data = NULL;
		}
		else{
			int length = strlen(other.m_data);
			m_data = new char[length + 1];
			strcpy(m_data, other.m_data);
		}
	}
	return *this;
}

String String::operator+(const String &other){
	String newString;
	if (other.m_data == NULL) newString = *this;
	else if (m_data == NULL) newString = other;
	else{
		newString.m_data = new char[strlen(m_data) + strlen(other.m_data) + 1];
		strcpy(newString.m_data, m_data);
		strcat(newString.m_data, other.m_data);
	}
	return newString;
}

char& String::operator[](unsigned int i){
	if (i >= 0 && i < strlen(m_data)) return m_data[i];
}


int main(){
	return 0;
}

注意:上面的赋值构造函数没有考虑异常安全性,考虑异常安全性的版本如下:
String& String::operator=(const String &other){
	if (this != &other){
		String strTemp(other);
		char *pTemp = strTemp.m_data;
		strTemp.m_data = m_data;
		m_data = pTemp;
	}
	return *this;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值