【C++】自定义MyString类

这次主要是实践一下内存的管理和类的一些写法。当然了,还包括<<运算符的重载。

一些需要注意的点:

1.内存空间的管理一定要处理好,new[]一定要搭配delete[]使用

2.拷贝赋值函数要检测是否是自我赋值,不然内存空间会直接销毁

3.为了可以连续使用=和<<,返回值务必使用引用

4.其它的就是一些编码小细节了,代码里面大部分都有注释

PS:今天才发现字符数组居然是可以直接输出的。我之前都是一个个遍历的,人晕了

#include<iostream>
#include<cstring> 

using namespace std;

class MyString{
	public:
		MyString(const char *s = 0);
		MyString(const MyString &str);
		MyString& operator=(const MyString &str);
		~MyString();
		void display();
    	friend ostream &operator<<(ostream &o, const MyString &str)
    	{
	        o<<str.myString;
			return o;
    	}
	private:
		char *myString;
		int m_size;//需要记录字符串长度 
};

void MyString::display(){
	char *p = myString;//这里需要暂存这个指针,不然会内存溢出 
	for(int i=0;i<m_size;i++){
		cout<<*myString;
		myString++;
	}
	myString = p;//赋值回去 
	cout<<endl; 
}

MyString::MyString(const char *s){
	if(s!=nullptr){
		m_size = strlen(s);
		myString = new char[m_size+1];
		strcpy(myString,s); 
	}else{
		m_size = 0;
		myString = new char[m_size+1];
		myString[0] = '\0';
	}
}

MyString::MyString(const MyString &str){//需要加const限定类型 
	//这里是构造函数 所以不需要删除原本的空间
	m_size = str.m_size;
 	myString = new char[m_size + 1];
 	strcpy(myString, str.myString);
}

MyString::~MyString(){
	delete[] myString;//new【】 和 delete【】一定要组合使用 
}

MyString& MyString::operator=(const MyString &str){
	//需要添加自我赋值判断 
	if(&str==this){
		return *this;//返回的是引用 
	}
	m_size = str.m_size;//得到空间大小
	delete[] myString; 
	
	//申请新的内存空间 
	myString = new char[m_size+1];
	strcpy(myString,str.myString);//赋值
	
	
	return *this;//返回本对象的引用 
}


//主函数测试 
int main(){
	
	char s1[] = "string1";
	char s2[] = "string2";
	int  a[] = {1,2,3,4,5,6,7,8,9};
	MyString mstr1(s1);//使用s对MyString赋值
	mstr1.display();
	MyString mstr2(s2);
	mstr2.display();
	mstr2 = mstr1;
	mstr2.display();
	
	MyString mstr3(mstr1);
	mstr3.display();
	cout<<mstr3<<endl;
	
	cout<<s1<<endl;//试验了一下,字符数组可以直接被这样输出 
}
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值