c++运算符重载及遇到的问题总结

#include<iostream>
#include<cstring>
using namespace std;
class String {
private:
	char* s;
	int len;
public:
	String(const char* str) {
			len = strlen(str);
			s = new char[len+1];
			for (int i = 0; i < len; i++) {
				s[i] = str[i];
			}
			s[len]='\0';
	}
	String() {
		s=nullptr;
	}
	String(const String& a) {
		len = a.len;
		s = new char[len+1];
		for (int i = 0; i <= len; i++) {
			s[i] = a.s[i];
		}
	}
	//~String() {
	//	delete[] s;
	//}
	void set(char* s);   //为该对象赋值
	void show();         //显示该对象中保存的字符串
	int getlen();        //返回该对象的字符串长度
	void dechar(char ch);//在该对象保存的字符串中查找并删除指定的所有字符
	
	String& operator=(const String& p) {
		len = p.len;
		s = new char[len+1];
		for (int i = 0; i < len; i++) {
			s[i] = p.s[i];
		}
		s[len] = '\0';
		return *this;
	}
	//String& operator+=(String& p) {
		//char* t = new char[len+1];
		//for (int i = 0; i < len; i++)
		//	t[i] = s[i];
		//t[len] = '\0';
		//len += p.len;
		//delete[] s;
		//s = new char[len+1];
		//for (int i = 0; i < len-p.len; i++)
		//	s[i] = t[i];
		//delete[] t;
		//int j = 0;
		//for (int i = len-p.len; i < len; i++) {
		//	this->s[i] = p.s[j++];
		//}
		//this->s[len] = '\0';
		//return *this;
	//}
	friend String operator+(String& a, String& b) {
		String temp;
		temp.len = a.getlen() + b.getlen();
		temp.s = new char[temp.len +1];
		for (int i = 0; i < a.getlen(); i++) {
			temp.s[i] = a.s[i];
		}
		int i = 0;
		for (int j = a.getlen() ; j < temp.len; j++) {
			temp.s[j] = b.s[i];
			i++;
		}
		temp.s[temp.len] = '\0';
		return temp;
	}
	int operator==(String& a) {
		int flag = 1;
		if (len != a.len)
			return 0;
		for (int i = 0; i < len; i++) {
			if (s[i] != a.s[i]) {
				flag = 0;
			}
		}
		return flag;
	}
};

void String::set(char* sn) {
	if (s != nullptr) {
		delete[]s;
		s = nullptr;
	}
	len = strlen(sn);
	s = new char[len+1];
	for (int i = 0; i <=len; i++) {
		s[i] = sn[i];
	}
}
void String::show() {
	cout << s << endl;
}
int String::getlen() {
	return len;
}
void String::dechar(char ch) {
	int i, j;
	i = 0, j = 0;
	for (i = 0; i < len; i++) {
		if (s[i] != ch) {
			s[j++] = s[i];
		}
		len = j;
		s[j] = '\0';
	}
}
int main() {
	char s1[1000];
	char s2[1000];
	cin >> s1;
	
	String a(s1);
	cin >> s2;
	String b(s2);
	cout << a.getlen() << endl;
	cout << b.getlen() << endl;
	//String p;
	//p=(a+b);
	(a+b).show();
	//String p1 ;
	//p1 = b+b;
	(b+b).show();
	if (a == b) {
		cout << 1;
	}
	else
		cout << 0;
}

在对字符串进行拓宽操作时

String& operator+=(String& p) {
		char* t = new char[len+1];
		for (int i = 0; i < len; i++)
			t[i] = s[i];
		t[len] = '\0';
		len += p.len;
		delete[] s;
		s = new char[len+1];
		for (int i = 0; i < len-p.len; i++)
	    	s[i] = t[i];
		delete[] t;
		int j = 0;
		for (int i = len-p.len; i < len; i++) {
			this->s[i] = p.s[j++];
		}
		this->s[len] = '\0';
		return *this;
	}

先将字符串s拷贝到临时字符串t上,后将s释放,再重新对s new新的足够的空间,重新对s进行操作。

字符串输出乱码的解决:
在字符串的末尾加上 ‘\0’

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值