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 ...
随机推荐
- Laravel 之文件上传
配置文件: config/filesystems.php, 新建存储空间 'uplaods' => [ 'driver' => 'local', 'root' => storage_ ...
- R 包安装、载入和卸载
生物上的一些包可以这样安装 source("https://bioconductor.org/biocLite.R") biocLite("affy") 一般的 ...
- android 活动
一.Activity 声明周期 1 创建 把页面上的个元素加载到内存 onCreate 2 开始 把页面显示到屏幕 onStart 3 恢复 让页面在屏幕活动 onResume 4 暂停 停止页面动作 ...
- Google代码风格指南
官网:https://github.com/google/styleguide 中文版:https://github.com/zh-google-styleguide/zh-google-styleg ...
- SSD S.M.A.R.T
经过多年HDD硬盘厂商的完善,S.M.A.R.T已经形成了一些标准,但对于SSD来说,大多数S.M.A.R.T都是自定义的,以至于每个厂商所提供的参数并不一致,但大体都会参考HDD S.M.A.R.T ...
- python实现网速控制,限制上传下载速度
对于python的web,比如flask使用的werkzeug,首先找到wsgi的请求和响应的代码,使用算法实现大文件的小速率上传和下载 考虑python实现socket限流 关于限速的讨论:http ...
- win10 UWP 申请微软开发人员
申请微软开发人员能够到https://dev.windows.com/zh-cn/programs/join 假设是学生,先去http://www.dreamspark.com/ 假设是英文,点stu ...
- eclipse中progress一直在刷新问题处理
- HDU 5274 Dylans loves tree(LCA+dfs时间戳+成段更新 OR 树链剖分+单点更新)
Problem Description Dylans is given a tree with N nodes. All nodes have a value A[i].Nodes on tree i ...
- 翻译:A Tutorial on the Device Tree (Zynq) -- Part II
A Tutorial on the Device Tree (Zynq) -- Part II 设备树结构 Zynq的设备树如下: /dts-v1/; / { #address-cells = < ...