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

//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");
}
时间: 2024-09-11 08:42:20

实现string类的操作符重载 + = &gt; &lt; == != &gt;&gt; &lt;&lt;的相关文章

c++ 操作符重载-关于操作符重载的问题

问题描述 关于操作符重载的问题 C++中如果想要对某个类设计一个友元的操作符重载,比如string类型支持string1+string2. 如果返回一个引用的话,编译器会报错.因为返回的类是局部变量,无法引用. 比如: //此函数为List类的友元函数. //template friend List& operator+(List& L1,List& L2); template List& operator+(List& L1,List& L2) { Lis

c++-关于C++操作符重载的问题

问题描述 关于C++操作符重载的问题 C++中如果想要对某个类设计一个友元的操作符重载,比如string类型支持string1+string2. 如果返回一个对象的引用的话,编译器会报错.因为返回的对象是局部变量,无法引用. 比如: //此函数为List类的友元函数. //template friend List& operator+(List& L1,List& L2); template List& operator+(List& L1,List& L2

【C/C++学院】(8)全局函数和类成员函数转化/友元/操作符重载

1.全局函数和类成员函数转化     全局函数和成员函数的相互转化:只需要修改一个指向本类的this指针: #include <iostream> using namespace std; class Test { public: Test(int a, int b) { this->a = a; this->b = b; } //成员函数 Test &Gadd2(Test &t2) { this->a = this->a + t2.a; this-&g

operate-范磊c++,在十八章写String类 “重载输入运算符” 遇到问题,请各位大侠帮忙指点!

问题描述 范磊c++,在十八章写String类 "重载输入运算符" 遇到问题,请各位大侠帮忙指点! #include using namespace std; class String { public: String(); String(char*); String(String&); virtual ~String(){cout<<"析构函数执行n";delete []str;len=0;} const int getlen()const{r

C#中奇妙的操作符重载

C#中奇妙的操作符重载 细心的朋友可能发现,C#虽然可以重载操作符,但和C++比较起来,却有很大的不同.定义的时候重载操作符方法必须是static,而且至少有一个参数(一目和二目分别是一个和两个),C#和C++比起来,最重要的特征是:<.>:==.!=:true.false必须成对出现,即重载了"<"就必须重载">",重载了"=="就必须重载"!=",重载了"true"就必须重载&q

C++面试中string类的一种正确写法

C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源.具体来说: 能像 int 类型那样定义变量,并且支持赋值.复制. 能用作函数的参数类型及返回类型. 能用作标准库容器的元素类型,即 vector/list/deque 的 value_type.(用作 std::map 的 key_type 是更进一步的要求,本文从略). 换言之,你的 String 能让以下代码编译运行通过,并且没有内存方面的错误. 1

C#中如何利用操作符重载和转换操作符

原文:C#中如何利用操作符重载和转换操作符 操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成把两个整数加到一起的代码. 当编译器发现两个string类型的实例使用+操作符的时候,编译器会生成把两个字符串连接到一起的代码.那么编译器怎么就会知道这样做呢?如何进行操作符重载呢? 下面C#代码展示了一个类中如何进行操作符重载: namespace Do

java String类常量池分析及&quot;equals&quot;和&quot;==”区别详细介绍_java

java "equals"和"=="异同 首先简单说一下"equal"和"==" ==操作对于基本数据类型比较的是两个变量的值是否相等, 对于引用型变量表示的是两个变量在堆中存储的地址是否相同, 即栈中的内容是否相同 equals操作表示的两个变量是否是对同一个对象的引用, 即堆中的内容是否相同. 综上,==比较的是2个对象的地址,而equals比较的是2个对象的内容. 再简单介绍一下String类 String类 又称作不可

分享C++面试中string类的一种正确写法_C 语言

具体来说: 能像 int 类型那样定义变量,并且支持赋值.复制. 能用作函数的参数类型及返回类型. 能用作标准库容器的元素类型,即 vector/list/deque 的 value_type.(用作 std::map 的 key_type 是更进一步的要求,本文从略). 换言之,你的 String 能让以下代码编译运行通过,并且没有内存方面的错误. 复制代码 代码如下: void foo(String x)  {  }  void bar(const String& x)  {  }  Str