String运算符重载

运算符的重载实际是一种特殊的函数重载,必须定义一个函数,并告诉C++编译器,当遇到该重载的运算符时调用此函数。这个函数叫做运算符重载函数,通常为类的成员函数。

     定义运算符重载函数的一般格式:

返回值类型 类名::operator重载的运算符(参数表)

{……}

operator是关键字,它与重载的运算符一起构成函数名。因函数名的特殊性,C++编译器可以将这类函数识别出来。

小结:

 1. 运算符重载函数的函数名必须为关键字operator加一个合法的运算符。在调用该函数时,将右操作数作为函数的实参。

2.  当用类的成员函数实现运算符的重载时,运算符重载函数的参数(当为双目运算符时)为一个或(当为单目运算符时)没有。运算符的左操作数一定是对象,因为重载的运算符是该对象的成员函数,而右操作数是该函数的参数。

3.  单目运算符“++”和“--”存在前置与后置问题。

前置“++”格式为:

返回类型  类名::operator++(){……}

而后置“++”格式为:

返回类型  类名::operator++(int){……}

后置“++”中的参数int仅用作区分,并无实际意义,可以给一个变量名,也可以不给变量名。

4.  C++中只有极少数的运算符不允许重载。

重载运算符有以下几种限制

1).不可臆造新的运算符

2).不能改变运算符原有的优先级、结合性和语法结构,不能改变运算符操作数的个数

3).运算符重载不宜使用过多

4).重载运算符含义必须清楚,不能有二义性

String运算符重载具体代码如下:

#include<iostream>
#include<string>
using namespace std;

class String;                                      //先声明
ostream& operator<<(ostream &out, const String &s);//输出流
istream& operator>>(istream &in, String &s);       //输入流

class String                                        //定义String类
{
	friend ostream& operator<<(ostream &out, const String &s);//友元
    friend istream& operator>>(istream &in, String &s);
public:
	String(const char *str = NULL)                  //构造函数
	{
		if(str == NULL)
		{
			m_data = new char[1];
			m_data[0] = '\0';
		}
		else
		{
			m_data = new char[strlen(str)+1];
			strcpy(m_data,str);
		}
	}
	String(const String &s)                         //拷贝构造函数
	{
		m_data = new char[strlen(s.m_data)+1];
		strcpy(m_data,s.m_data);
	}
	String& operator=(const String &s)              //运算符重载
	{
		if(this != &s)
		{
			free(m_data);
			m_data = new char[strlen(s.m_data)+1];
			strcpy(m_data,s.m_data);
		}
		return *this;
	}
	~String()                                        //析构函数
	{
		delete []m_data;
	}
	String operator+(const String &s)                //s = s1 + s2
	{
		char *p = new char[strlen(m_data) +strlen(s.m_data)+1];
		strcpy(p,m_data);
		strcat(p,s.m_data);
		String tmp(p);
		delete []p;
		return tmp;
	}
	String operator+=(const String &s)               //s1 += s2
	{
		char *p = m_data;
		p = new char[strlen(m_data) +strlen(s.m_data)+1];
		strcpy(p,m_data);
		strcat(p,s.m_data);
		String tmp(p);
		delete []p;
		return tmp;
	}
	char&  operator[](int index)                      //重载下标运算符
	{
		return m_data[index];
	}
	bool operator==(String &s)                        //s1 = s2
	{
		if (strcmp(m_data,s.m_data) == 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	bool operator!=(String &s)                        //s1 != s2
	{
		if (strcmp(m_data,s.m_data) != 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	bool operator>(String &s)                           //s1 > s2
	{
		if (strcmp(m_data,s.m_data) > 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	bool operator<=(String &s)                          //s1 <= s2
	{
		if (strcmp(m_data,s.m_data) <= 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	bool operator<(String &s)                           //s1 < s2
	{
		if (strcmp(m_data,s.m_data) < 0 )
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	bool operator>=(String &s)                          //s1 >= s2
	{
		if (strcmp(m_data,s.m_data) >= 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
private:
	char *m_data;                                      //私有成员
};

ostream& operator<<(ostream &out, const String &s)
{
	out<<s.m_data;
	return out;
}

istream& operator>>(istream &in, String &s)
{
	in>>s.m_data;
	return in;
}

void main()                                            //测试函数
{
    String s1("hello");
	String s2("world");
    String s3= s1 + s2;
	String s;
	s = s1 += s2;
	cout<<s1[0]<<endl;
	cout<<s1<<endl;
	cout<<s3<<endl;
	cout<<s<<endl;

	String s4("helloworld");
	String s5("helloworld");
	String s6("hello");
	String s7("hi");

	if (s4 == s5)
	{
		cout<<"s4和s5相等!"<<endl;
	}
	else
	{
		cout<<"s4和s5不相等!"<<endl;
	}
	if(s4 > s7)
	{
		cout<<"s4大于s7!"<<endl;
	}
	else if(s4 < s7)
	{
		cout<<"s4小于s7!"<<endl;
	}
	else
	{
		cout<<"s4等于s7!"<<endl;
	}
	if(s4 >= s6)
	{
		cout<<"s4大等于s6!"<<endl;
	}
	else if(s4 <= s6)
	{
		cout<<"s4小等于s7!"<<endl;
	}
}

希望大家可以指出我的不足,谢谢大家。

时间: 2024-12-25 19:10:08

String运算符重载的相关文章

PKU C++程序设计实习 学习笔记4 运算符重载

第四章 运算符重载 4.1 运算符重载的基本概念 1. 运算符 2. 自定义数据类型与运算符重载 C++提供了数据抽象的手段:用户自己定义数据类型 -- 类 ? 调用类的成员函数->操作它的对象 类的成员函数->操作对象时,很不方便 ? 在数学上,两个复数可以直接进行+/-等运算 Vs. 在C++中,直接将+或-用于复数是不允许的 3. 运算符重载 对抽象数据类型也能够直接使用C++提供的运算符 ? 程序更简洁 ? 代码更容易理解 运算符重载 ? 对已有的运算符赋予多重的含义 ? 使同一运算符

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载、!运算符重载、赋值运算符重载 、String类([]、 +、 += 运算符重载)、&gt;&gt;和&lt;&lt;运算符重载

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载.!运算符重载.赋值运算符重载 .String类([]. +. += 运算符重载).>>和<<运算符重载 一.++/--运算符重载 1.前置++运算符重载 成员函数的方式重载,原型为: 函数类型 & operator++(); 友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &); 2.后置++运算符重载 成员函数的方式重载,原型为:

[c++]String字符串类的运算符重载

在c++中有一个新定义的类型string,可以不用那么麻烦的操作字符串,并且一些高级的运算符重载让她的使用更加便捷 下面是String类的定义和成员函数的定义: #ifndef operator_operator_h #define operator_operator_h #include<iostream> #include<string.h> using namespace std; class String { friend ostream& operator<

Kotlin中复合赋值(+=,-=,……)运算符重载

本篇建立在已经了解了kotlin中运算符重载的理念以及如何实现的基础上. 来我们首先写一个简单的类,然后重载运算符+,+=,-,-=这个几个运算符.代码如下: data class Point(var x: Int, var y: Int) { operator fun plus(point: Point): Point { return Point(this.x + point.x, this.y + point.y) } operator fun plusAssign(point: Poin

C++运算符重载的妙用

运算符重载(Operator overloading)是C++重要特性之中的一个,本文通过列举标准库中的运算符重载实例,展示运算符重载在C++里的妙用.详细包含重载operator<<,operator>>支持cin,cout输入输出.重载operator[],实现下标运算.重载operator+=实现元素追加:重载operator()实现函数调用.假设你对C++的运算符重载掌握的游刃有余.那就无需继续往下看了. 运算符重载带来的优点就是--让代码变得简洁.以下将展示几个标准库因使

C++:运算符重载函数之&quot;++&quot;、&quot;--&quot;、&quot;[ ]&quot;的应用

5.2.5 "++"和"--"的重载 对于前缀方式++ob,可以用运算符函数重载为: ob.operator++() //成员函数重载 或 operator++(X &ob) //友元函数重载,其中ob为类X的对象的引用 对于后缀方式++ob,可以用运算符函数重载为: ob.operator++(int) //成员函数重载 或 operator++(X &ob,int) //友元函数重载,其中ob为类X的对象的引用 调用时,参数int一般被传递给值0

C#中运算符重载

很多语言都允许程序员使用运算符重载,尽管从编程的角度看,这没有其必要性,但是对于代码来讲可以提高它的可读性,带来许多方便之处.最简单的例子就是,我们用String类的时候,用"+"运算符直接实现字符串的连接,很方便很直观. 运算符重载实例: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; namespace impli

scala学习手记7 - 运算符重载

从语法上来说scala是没有运算符的.之前的一节里也曾提到过scala的运算符实际上是方法名,如1 + 2实际上就是1.+(2).我们可以将之视为运算符,是因为scala的一个特性:如果方法的参数小于等于1个的话,那么"."和括号就都是可选的. scala的运算符重载指的就是重载+.-这样的符号--和C.java或者python等语言不一样,我们需要自己定义这些符号如何实现. 下面看一个"+"运算符实现的例子.这里定义了一个Complex类,Complex指的是复数

【C++】复数的运算符重载

运算符重载的定义: 用户对于自定义类型的运算操作,例如复数的运算.需要重新定义运算符号(创建函数). 除了类属关系运算符".".成员指针运算符".*".作用域运算符"::".sizeof运算符和三目运算符"?:"以外,C++中的所有运算符都可以重载. 复数的运算符重载如下: <span style="font-size:18px;"> #include<iostream> #incl