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 ...
随机推荐
- DBA总结
HA MHA(1)从宕机崩溃的master保存二进制日志事件(binlog events);(2)识别含有最新更新的slave:(3)应用差异的中继日志(relay log)到其他的slave:(4) ...
- Java8 时区DateTime API
原文:http://www.yiibai.com/java8/java8_zoneddateapi.html 时区日期时间的API正在使用当时区要被考虑时. 让我们来看看他们的操作. 选择使用任何编辑 ...
- JS--截取字符串常用方法详细
使用 substring()或者slice() 函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例子: str=”jpg|bmp|gif|ico|png”; arr=the ...
- 全能无线渗透测试工具,一个LAZY就搞定了
近来一直在研究无线安全方面的东西,特别是在无线渗透测试这块,每次渗透测试时总要来回不停的切换操作和挑选利器,很是麻烦.就想看看是否可以有一款功能全面的集合型工具. 正所谓功夫不负有心人,还真有这么一个 ...
- excel 分类汇总函数
1.先用数组公式对单元格区域 B3:B39 ,进行提取去重复非空调单元格信息.单元格B52数组公式: =INDIRECT(TEXT(MIN(IF((COUNTIF(B$51:B51,B$3:B$39) ...
- start memcached
memcached -m 64 -p 11211 -u fly -l 127.0.0.1 ------------------------------------------------------- ...
- SQL server 数据库测试题
- C# 通过window消息控制指定控件的scroll滚动
[DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)] private st ...
- Redis 脚本及其应用
参考:http://www.runoob.com/redis/redis-scripting.html Redis 脚本使用 Lua 解释器来执行脚本. Reids 2.6 版本通过内嵌支持 Lua ...
- Spring中的IOC容器(学习笔记)
如何将Bean配置到Spring的Bean容器中 通过xml配置文件: Bean实现类来自第三方类库:如“DataSource”等 需要命名空间配置如:context,aop,mvc等 ...