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. DBA总结

    HA MHA(1)从宕机崩溃的master保存二进制日志事件(binlog events);(2)识别含有最新更新的slave:(3)应用差异的中继日志(relay log)到其他的slave:(4) ...

  2. Java8 时区DateTime API

    原文:http://www.yiibai.com/java8/java8_zoneddateapi.html 时区日期时间的API正在使用当时区要被考虑时. 让我们来看看他们的操作. 选择使用任何编辑 ...

  3. JS--截取字符串常用方法详细

    使用 substring()或者slice() 函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例子: str=”jpg|bmp|gif|ico|png”; arr=the ...

  4. 全能无线渗透测试工具,一个LAZY就搞定了

    近来一直在研究无线安全方面的东西,特别是在无线渗透测试这块,每次渗透测试时总要来回不停的切换操作和挑选利器,很是麻烦.就想看看是否可以有一款功能全面的集合型工具. 正所谓功夫不负有心人,还真有这么一个 ...

  5. excel 分类汇总函数

    1.先用数组公式对单元格区域 B3:B39 ,进行提取去重复非空调单元格信息.单元格B52数组公式: =INDIRECT(TEXT(MIN(IF((COUNTIF(B$51:B51,B$3:B$39) ...

  6. start memcached

    memcached -m 64 -p 11211 -u fly -l 127.0.0.1 ------------------------------------------------------- ...

  7. SQL server 数据库测试题

  8. C# 通过window消息控制指定控件的scroll滚动

     [DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)]         private st ...

  9. Redis 脚本及其应用

    参考:http://www.runoob.com/redis/redis-scripting.html Redis 脚本使用 Lua 解释器来执行脚本. Reids 2.6 版本通过内嵌支持 Lua ...

  10. Spring中的IOC容器(学习笔记)

    如何将Bean配置到Spring的Bean容器中 通过xml配置文件: Bean实现类来自第三方类库:如“DataSource”等      需要命名空间配置如:context,aop,mvc等   ...