C++中预定义的加、减等运算符的操作对象只能是基本的数据类型。如果要在用户自定义的类型对象上应用同样的运算符,就需要通过运算符重载来重新定义其实现,使它能够用于自定义类型执行特定的操作,所以运算符重载的基本要求是要跟应用在基本数据类型上的功能“”看起来“”是一致的。

运算符重载的实质是函数重载,其定义也于一般函数的定义类似,唯一一点区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下:

  <返回值类型> operator <运算符符号>(<参数表>)
{
<函数体>
}

对比一般函数的定义格式为:

<返回值类型> <函数名>(<参数表>)
{
<函数体>
}

把一般函数定义中的“函数名”替换为“operator+运算符”的形式即为运算符的定义。

对一个自定义类型对象应用操作符运算,我的理解是,相当于对该对象执行操作符重载函数所定义的行为,把重载的运算符操作当成一般函数操作来看待,理解上就会简单很多。

给出string类的大部分运算符实现,包括string类构造函数,拷贝构造函数实现,运算符“=”、“+”、“+=”、“!=”、“>”、“<”、“<<”、“>>”的实现,其他可参照实现。

Mystring.h头文件各运算符重载声明:

#ifndef __Mystring
#define __Mystring
#include <iostream> class Mystring
{
public:
Mystring(const char *str=NULL);//构造函数
Mystring(const Mystring& obj); //拷贝构造函数
Mystring operator=(const Mystring &obj);
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); friend std::ostream & operator<<(std::ostream &out,const Mystring &obj);
friend std::istream & operator>>(std::istream &in,Mystring &obj); ~Mystring(); private:
char *pstr; }; #endif

Mysring.cpp各运算符重载定义:

#include "Mystring.h"

using namespace std;

Mystring::Mystring(const char * str)
{
if(NULL==str)
{
this->pstr=new char[1];
pstr[0]='\n';
}
else
{
this->pstr=new char[strlen(str)+1];
strcpy(this->pstr,str);
}
} Mystring::Mystring(const Mystring & obj)
{
this->pstr=new char[strlen(obj.pstr)+1];
//实现深拷贝
strcpy(this->pstr,obj.pstr);
}
Mystring::~Mystring()
{
delete [] this->pstr;
//释放之后把指针指向空,防止后文引用该指针
this->pstr=NULL;
} Mystring Mystring::operator=(const Mystring &obj)
{
//分配内存空间,记得+1,因为c风格的字符串以'\n'结尾,需要多加一个字符
this->pstr=new char[strlen(obj.pstr)+1];
strcpy(this->pstr,obj.pstr);
return *this;
} Mystring Mystring::operator+(const Mystring &obj)
{
Mystring mstr;
mstr.pstr=new char[strlen(this->pstr)+strlen(obj.pstr)+1];
sprintf(mstr.pstr,"%s%s",this->pstr,obj.pstr);
return mstr;
}
Mystring Mystring::operator+=(const Mystring &obj)
{
Mystring mstr;
mstr.pstr=new char[strlen(this->pstr)+1];
strcpy(mstr.pstr,this->pstr);
this->pstr=new char[strlen(mstr.pstr)+strlen(obj.pstr)+1];
sprintf(this->pstr,"%s%s",mstr.pstr,obj.pstr);
return *this;
} bool Mystring::operator!=(const Mystring &obj)
{
if(strcmp(this->pstr,obj.pstr)==0)
{
return false;
}
else
{
return true;
}
} bool Mystring::operator>(const Mystring &obj)
{
if(strcmp(this->pstr,obj.pstr)>0)
{
return true;
}
else
{
return false;
}
} bool Mystring::operator<(const Mystring &obj)
{
if(strcmp(this->pstr,obj.pstr)<0)
{
return true;
}
else
{
return false;
}
} ostream & operator<<(ostream &out,const Mystring &obj)
{
out<<obj.pstr;
return out;
} istream & operator>>(istream &in,Mystring &obj)
{
//分配内存空间
obj.pstr=new char[1024];
in>>obj.pstr;
return in;
}

在main中测试运算符功能:

#include <iostream>
#include "Mystring.h"
using namespace std;
int main()
{
Mystring str1("abc");
cout<<"str1经过初始化之后值为:"<<str1<<endl;
Mystring str2;
str2=str1;
cout<<"str2经过str1初始化之后值为:"<<str2<<endl;
Mystring str3;
str3=str1+str2;
cout<<"str1与str2之和str3为:"<<str3<<endl;
cout<<"请输入字符串str4:"<<endl;
Mystring str4;
cin>>str4;
cout<<"你输入的str4为:"<<str4<<endl;
if(str3!=str4)
{
cout<<"str3不等于str4"<<endl;
} if(str3>str4)
{
cout<<str3<<"大于"<<str4<<endl; }
if(str3<str4)
{
cout<<str3<<"小于"<<str4<<endl;
} system("pause");
return 0;
}

对str4输入字符串“ABCABC”,运行结果为:

注意:运算符中比较特殊的是输入输出流操作“<<”和“>>”,只能作为string类的友元(加friend)来实现,不能作为string类的成员函数实现。

string类中运算符重载实现的更多相关文章

  1. c++String类的运算符重载---21

    原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/  一,创建测试程序包 测试代码如下: /* Date: 2017-5-4 * Descripti ...

  2. 问题 B: 矩形类中运算符重载【C++】

    题目描述 定义一个矩形类,数据成员包括左下角和右上角坐标,定义的成员函数包括必要的构造函数.输入坐标的函数,实现矩形加法,以及计算并输出矩形面积的函数.要求使用提示中给出的测试函数并不得改动. 两个矩 ...

  3. c++中运算符重载

    c++语言中运算符重载都是通过函数来实现的,所以其实质为函数重载,当c++语言原有的一个运算符被重载之后,它原来所具有的语义并没有消失,只相当于针对一个特定的类定义了一个新的运算符. <1> ...

  4. YTU 2617: B C++时间类的运算符重载

    2617: B C++时间类的运算符重载 时间限制: 1 Sec  内存限制: 128 MB 提交: 284  解决: 108 题目描述 C++时间类的运算符重载 定义一个时间类Time,其数据成员为 ...

  5. String类中常用的操作

    一.获取: 1.获取字符串的长度(注意是方法,不是跟数组的属性一样的) int length(); 1 public static void getLength(){ 2 String s = &qu ...

  6. Java——String类中的compareTo方法总结

    String类的定义:    java.lang  类 String   java.lang.Object      java.lang.String 所有已实现的接口:Serializable, C ...

  7. sdut 4-1 复数类的运算符重载

    4-1 复数类的运算符重载 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 通过本题目的练习能够掌握成员运算符重载及友元运算符重载 要求定义一个复数类.重 ...

  8. Java String类中的intern()方法

    今天在看一本书的时候注意到一个String的intern()方法,平常没用过,只是见过这个方法,也没去仔细看过这个方法.所以今天看了一下.个人觉得给String类中加入这个方法可能是为了提升一点点性能 ...

  9. java面向对象中的String类中12种常用的方法

    1.字符串与字符数组的转换 字符串可以使用toCharArray()方法变成一个字符数组,也可以使用String类的构造方法把一个字符数组变成一个字符串. public class StringAPI ...

随机推荐

  1. WEB学习-HTML的骨架

    HTML的标准骨架 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  2. Codeforces 848B Rooter's Song(分类+模拟)

    题目链接 Rooter's Song 题意  有n个舞者站在x轴上或y轴上,每个人有不同的出发时间.x轴上的舞者垂直x轴正方向移动,y轴上的舞者垂直y轴正方向移动. 当x轴的舞者和y轴的舞者相遇时,他 ...

  3. electron 自定义菜单

    快捷键:http://electronjs.org/docs/api/accelerator

  4. BZOJ1016最小生成树计数 最小生成树 + 排列组合

    @[最小生成樹, 排列組合] Discription 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的 最小生成树.(如果两颗最小生成树中至少有一条边不 ...

  5. 使用Reveal 调试iOS应用程序

    Itty Bitty Apps发布了一款实用工具——Reveal,它能够在运行时调试和修改iOS应用程序.Reveal能连接到应用程序,并允许开发者编辑各种用户界面参数,这反过来会立即反应在程序的UI ...

  6. 【kotlin】报错 Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type List<String>?

    报错如下: 解决如下: 另一种情况: 解决如下:

  7. Liunx常用命令(备用)

    常用指令 ls        显示文件或目录 -l           列出文件详细信息l(list) -a          列出当前目录下所有文件及目录,包括隐藏的a(all) mkdir     ...

  8. 关于颜色(color、background)

    CSS3 HSL colors使用参考指南语法:<length> || <percentage> || <percentage>取值:<length> ...

  9. Yii框架中安装srbac扩展方法

    首先,下载srbac_1.3beta.zip文件和对应的blog-srbac_1.2_r228.zip 问什么要下载第二个文件,后面就知道了. 按照手册进行配置: 解压缩srbac_1.3beta.z ...

  10. 【转载】VS工具使用——代码图

    代码图:     心想,反正也调不出来,就试试这个东西吧,一打开,就认识到自己发现了一个新大陆:这个代码图可以让我们对一个工程文件有大体的了解,即函数的调用关系等.它是一个VS2013自带工具生成函数 ...