实现string类的操作符重载 + = > < == != >> <<-阿里云开发者社区

开发者社区> 云计算> 正文

实现string类的操作符重载 + = > < == != >> <<

简介: <pre code_snippet_id="596931" snippet_file_name="blog_20150203_1_6205569" name="code" class="objc">//MyString.h #pragma once #include &lt;iostream&gt; using namespace std; class MyString { priva
//MyString.h
#pragma  once

#include <iostream>
using namespace std;
class MyString
{
private:
	char *m_ptr;//内存空间
	
public:
	MyString(const char *str=NULL);//构造函数
	MyString(const MyString& obj); //拷贝构造函数
	~MyString();  //析构函数
public:
	// + = > < == != >> <<
	MyString operator+(const MyString& obj);  //连接
	MyString &operator=(const MyString& obj);  //赋值

	bool operator>(const MyString& obj);  //比较大小
	bool operator<(const MyString& obj);  //比较大小
	bool operator==(const MyString& obj);  //比较大小
	bool operator!=(const MyString& obj);  //比较大小

	friend istream& operator>>(istream& in, MyString &obj); //输入流
	friend ostream& operator<<(ostream& out, const MyString& obj);  //输出流
	
};
//MyString.cpp
#define _CRT_SECURE_NO_WARNINGS
#include "MyString.h"


MyString::MyString(const char *str)//构造函数
{
	if (str == NULL)
	{
		this->m_ptr = new char[1];
		this->m_ptr[0] = '\0';
	}
	else
	{
		this->m_ptr = new char[strlen(str)+1];
		strcpy(this->m_ptr, str);
	}
}

MyString::MyString(const MyString& obj) //拷贝构造函数
{
	this->m_ptr = new char[strlen(obj.m_ptr) + 1];
	strcpy(this->m_ptr, obj.m_ptr);
}

MyString::~MyString()  //析构函数
{
	delete[] m_ptr;
	this->m_ptr = NULL;
}

MyString MyString::operator+(const MyString& obj)  //连接
{
	MyString tmp;
	delete[] tmp.m_ptr;
	tmp.m_ptr = new char[strlen(this->m_ptr) + strlen(obj.m_ptr) + 1];
	sprintf(tmp.m_ptr, "%s%s", this->m_ptr, obj.m_ptr);
	return tmp;
}

MyString &MyString::operator=(const MyString& obj)  //赋值
{
	if (this->m_ptr != NULL)
	{
		delete[] m_ptr;
		this->m_ptr = NULL;
	}
	this->m_ptr = new char[strlen(obj.m_ptr) + 1];
	strcpy(this->m_ptr, obj.m_ptr);
	return *this;
}

bool MyString::operator>(const MyString& obj)  //比较大小
{
	if (-1 == strcmp(this->m_ptr, obj.m_ptr))
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool MyString::operator<(const MyString& obj) //比较大小
{
	if (1 == strcmp(this->m_ptr, obj.m_ptr))
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool MyString::operator==(const MyString& obj)  //比较大小
{
	if (0 == strcmp(this->m_ptr, obj.m_ptr))
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool MyString::operator!=(const MyString& obj)  //比较大小
{
	return !(*this==obj);
}

ostream& operator<<(ostream& out, const MyString& obj) //输出流
{
	out << obj.m_ptr;
	return out;
}

istream& operator>>(istream& in, MyString &obj) //输入流
{
	char tmp[1024 * 10];
	memset(tmp, 0, sizeof(tmp));
	in >> tmp;
	if (obj.m_ptr != NULL)
	{
		delete[] obj.m_ptr;
		obj.m_ptr = NULL;
	}
	obj.m_ptr = new char[strlen(tmp) + 1];
	strcpy(obj.m_ptr, tmp);
	return in;
}

//MyStringTest.cpp
#include "MyString.h"
using namespace std;

void run()
{
	MyString s1("abd");
	MyString s2("hello");
	MyString s3 = s2;
	MyString s4;
	//s1 = s2;
	s4 = s1 + s2;
	cout << s4 << endl;
	if (s1==s2)
	{
		cout << "相等" << endl;
	}
	else
	{
		cout << "不相等" << endl;
		if (s1 < s2)
		{
			cout << "s1<s2" << endl;
		}
		else if (s1 > s2)
		{
			cout << "s1>s2" << endl;
		}
	}
	cout << s1 <<","<< s2 << endl;
	cin >> s4;
	cout << s4 << endl;
}

void main()
{
	run();
	system("pause");
}


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

其他文章