string复制给char*_字符串(一)---重写string

v2-a4b65bc7b81a659a59339f7d4348470c_1440w.jpg?source=172ae18b
#define _CRT_SECURE_NO_WARNINGS//忽视警告(strlenf等函数为老式写法)
#include <iostream>
using namespace std;
class String
{
public:
	String();//只定义String类对象,不初始化时用的构造函数
	String(const char* str);//定义并初始化时用的构造
	String(const String& str);//拷贝构造
	String& operator=(const String& str);//赋值函数,不定义也行
                        //类本就有默认"=",可以完成一个对象赋值给另一个对象
	~String();//析构函数
        //重载<<,使输出时直接输出成员变量m_data;
	friend std::ostream& operator <<(std::ostream& out, const String& s);
        //重载+,使两个String类对象可以相加。返回值不能为引用
	friend String operator +(const String& s1, const String& s2);
        //重载+,使String类对象可以和字符数组相加。返回值不能为引用
	friend String operator +(const String& s1, const char* s2);
        //重载[],必须定义为成员函数
        char operator[](int id);
        //重载==
	bool operator==(const String& s);
	char* m_data;
	int length;
};
String::String()
{
	m_data = new char[1];
	m_data[0] = '0';
	length = 0;
}
String::String(const char* str)//以字符数组初始化String类对象
{
	length = strlen(str);
	m_data = new char[length + 1];//求长度的strlen不计算'0'
	strcpy(m_data, str);//字符复制会复制‘0’,故m_data要开辟足够空间
}
String::String(const String& str)//拷贝构造函数
{
	length = strlen(str.m_data);
	m_data = new char[length + 1];
	strcpy(m_data, str.m_data);
}
String& String::operator=(const String &str)
{
	if (this == &str)
	{//为了防止B=B时,直接把B给释放了,然后再赋值也没用了
		return *this;
	}
	//B=A,则B之前的数据不要了,要手动释放。
	delete[]m_data;
	length = strlen(str.m_data);
	m_data = new char[length + 1];
	strcpy(m_data, str.m_data);
	return *this;
}
String::~String()
{
	delete[]m_data;
	m_data = NULL;
}
std::ostream& operator <<(std::ostream& out, const String& s)
{
	out << s.m_data;//out在这里就是cout,因为cout也只是ostream类的一个对象而已
	return out;
}
//重载+,实现两个String对象可以相加
String operator +(const String& s1, const String& s2)
{
	String kid_string;
	int len = strlen(s1.m_data) + strlen(s2.m_data);
	kid_string.m_data = new char[len + 1];
	for (int i = 0; i < strlen(s1.m_data); i++)
		kid_string.m_data[i] = s1.m_data[i];
	for (int i = strlen(s1.m_data); i < len; i++)
		kid_string.m_data[i] = s2.m_data[i - strlen(s1.m_data)];//将s赋值给str后半段
	kid_string.m_data[len] = '0';
	kid_string.length = len;
	return kid_string;//kidstring是局部变量,返回值如果是kinstring的引用,operator+函数
         //一结束完成就死了。无法继续赋值运算符的计算。
         //故不能返回引用
}
String operator +(const String& s1, const char* s2)
{
	String kid_string;
	int len = strlen(s1.m_data) + strlen(s2);
	kid_string.m_data = new char[len + 1];
	for (int i = 0; i < strlen(s1.m_data); i++)
		kid_string.m_data[i] = s1.m_data[i];
	for (int i = strlen(s1.m_data); i < len; i++)
		kid_string.m_data[i] = s2[i - strlen(s1.m_data)];
	kid_string.m_data[len] = '0';
	kid_string.length = len;
	return kid_string;
}
char String::operator[](int id)
{
	return this->m_data[id];
}
bool String::operator==(const String& s)//传入一般都使用引用,速度快
{
       if(strcmp(m_data,s.m_data)==0)
           return true;
       else
           return false;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值