string类中运算符重载实现
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类中运算符重载实现的更多相关文章
- c++String类的运算符重载---21
原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 一,创建测试程序包 测试代码如下: /* Date: 2017-5-4 * Descripti ...
- 问题 B: 矩形类中运算符重载【C++】
题目描述 定义一个矩形类,数据成员包括左下角和右上角坐标,定义的成员函数包括必要的构造函数.输入坐标的函数,实现矩形加法,以及计算并输出矩形面积的函数.要求使用提示中给出的测试函数并不得改动. 两个矩 ...
- c++中运算符重载
c++语言中运算符重载都是通过函数来实现的,所以其实质为函数重载,当c++语言原有的一个运算符被重载之后,它原来所具有的语义并没有消失,只相当于针对一个特定的类定义了一个新的运算符. <1> ...
- YTU 2617: B C++时间类的运算符重载
2617: B C++时间类的运算符重载 时间限制: 1 Sec 内存限制: 128 MB 提交: 284 解决: 108 题目描述 C++时间类的运算符重载 定义一个时间类Time,其数据成员为 ...
- String类中常用的操作
一.获取: 1.获取字符串的长度(注意是方法,不是跟数组的属性一样的) int length(); 1 public static void getLength(){ 2 String s = &qu ...
- Java——String类中的compareTo方法总结
String类的定义: java.lang 类 String java.lang.Object java.lang.String 所有已实现的接口:Serializable, C ...
- sdut 4-1 复数类的运算符重载
4-1 复数类的运算符重载 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 通过本题目的练习能够掌握成员运算符重载及友元运算符重载 要求定义一个复数类.重 ...
- Java String类中的intern()方法
今天在看一本书的时候注意到一个String的intern()方法,平常没用过,只是见过这个方法,也没去仔细看过这个方法.所以今天看了一下.个人觉得给String类中加入这个方法可能是为了提升一点点性能 ...
- java面向对象中的String类中12种常用的方法
1.字符串与字符数组的转换 字符串可以使用toCharArray()方法变成一个字符数组,也可以使用String类的构造方法把一个字符数组变成一个字符串. public class StringAPI ...
随机推荐
- WEB学习-HTML的骨架
HTML的标准骨架 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...
- Codeforces 848B Rooter's Song(分类+模拟)
题目链接 Rooter's Song 题意 有n个舞者站在x轴上或y轴上,每个人有不同的出发时间.x轴上的舞者垂直x轴正方向移动,y轴上的舞者垂直y轴正方向移动. 当x轴的舞者和y轴的舞者相遇时,他 ...
- electron 自定义菜单
快捷键:http://electronjs.org/docs/api/accelerator
- BZOJ1016最小生成树计数 最小生成树 + 排列组合
@[最小生成樹, 排列組合] Discription 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的 最小生成树.(如果两颗最小生成树中至少有一条边不 ...
- 使用Reveal 调试iOS应用程序
Itty Bitty Apps发布了一款实用工具——Reveal,它能够在运行时调试和修改iOS应用程序.Reveal能连接到应用程序,并允许开发者编辑各种用户界面参数,这反过来会立即反应在程序的UI ...
- 【kotlin】报错 Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type List<String>?
报错如下: 解决如下: 另一种情况: 解决如下:
- Liunx常用命令(备用)
常用指令 ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all) mkdir ...
- 关于颜色(color、background)
CSS3 HSL colors使用参考指南语法:<length> || <percentage> || <percentage>取值:<length> ...
- Yii框架中安装srbac扩展方法
首先,下载srbac_1.3beta.zip文件和对应的blog-srbac_1.2_r228.zip 问什么要下载第二个文件,后面就知道了. 按照手册进行配置: 解压缩srbac_1.3beta.z ...
- 【转载】VS工具使用——代码图
代码图: 心想,反正也调不出来,就试试这个东西吧,一打开,就认识到自己发现了一个新大陆:这个代码图可以让我们对一个工程文件有大体的了解,即函数的调用关系等.它是一个VS2013自带工具生成函数 ...