一个String类的建简易实现

因为一个string类的实现很能反应一个c++程序员的水平,希望以后自己能够多动手写一写这些东西;

其中比较重要的那几个构造函数和析构函数;如果能够把ostream的重载写出来将会更加流弊


class String {
	friend ostream& operator<<(ostream& out, const String& str) {  //这个输出符重载和friend很重要
		//理解为什么要加用friend,因为不用friend人家以为你是重载的一元运算符,那么你的参数就会有问题
		return str.Print(out);  //返回的是ostream&类型,这样就可以和cout<<s<<endl兼容,而不是cout<<s;cout<<endl;
		//将str放入stream交给print来进行 或者使用以下方式也可以;
			//cout << str.m_data;
			//return cout;
	}
public:
	String(const char* str = NULL);  //构造函数    加分项:以下内容加const很重要
	String(const String& other);  //拷贝构造
	~String(void);  //析构
	String& operator=(const String& other);  //赋值函数
	char* operator*();
	
private:
	char* m_data;
	ostream& Print(ostream& out) const;
};

String::String(const char* str) {
	if (str == NULL) {			//加分项:如果是空字符串,自动申请存放一个‘\0’标志
		m_data = new char[1];
		*m_data = '\0';
	}
	else {
		int lenth = strlen(str);
		m_data = new char[lenth + 1];
		strcpy(m_data, str);
	}
}

String::~String(void) {
	delete[] m_data;  //怎样取delete一个数组
}

String::String(const String& other) {
	int length = strlen(other.m_data);
	m_data = new char[length + 1];  //如果能给m_data加一个NULL判断更好
	strcpy(m_data, other.m_data);
}

String& String::operator=(const String& other) {
	if (this == &other) {  //得分点:自检查
		return *this;
	}
	if (m_data) delete[] m_data;  //得分点:删除原来的内存资源  这儿没有用到引用计数,所以可以直接delete掉
	int length = strlen(other.m_data);
	m_data = new char[length + 1];  //如果能给m_data加一个NULL判断更好
	strcpy(m_data, other.m_data);
	return *this;  //返回本对象的引用
}

char* String::operator*() {
	return this->m_data;
}

ostream& String::Print(ostream& out) const {
	out << m_data;
	return out;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值