String类运算符重载,自己实现
body, table{font-family: 微软雅黑; font-size: 10pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}
|
#include <iostream>
#include<stdlib.h>
#include<stdio.h>
#include<sstream>
#include<string.h>
using namespace std;
class String
{
private:
char *pstr_;
public:
String();
String(const char *);
String(const String&);
~String();
String & operator = (const String &);
String & operator = (const char *);
String & operator += (const String &);
String & operator += (const char *);
char & operator [] (std::size_t index);
const char & operator [](std::size_t index)const;
std::size_t size() const;
const char* c_str() const;
friend bool operator == (const String &,const String &);
friend bool operator != (const String &,const String &);
friend bool operator < (const String &,const String &);
friend bool operator > (const String &,const String &);
friend bool operator <= (const String &,const String &);
friend bool operator >= (const String &,const String &);
friend std::ostream & operator << (std::ostream & os,const String &s);
friend std::istream & operator >> (std::istream & is,String & s);
};
String operator + (const String &,const String &);
String operator + (const String &,const char *);
String operator + (const char *,const String &);
String::String()
{
cout<<"String()"<<endl;
pstr_=new char[1];
strcpy(pstr_,"");
}
String::~String()
{
cout<<"~String()"<<endl;
delete []pstr_;
}
String::String(const char *str)
{
cout<<"String(const char *)"<<endl;
pstr_=new char[strlen(str)+1];
strcpy(pstr_,str);
}
String :: String(const String & s)
{
cout<<"String(const String &)"<<endl;
pstr_=new char[strlen(s.pstr_)+1];
strcpy(pstr_,s.pstr_);
}
String & String::operator = (const String & s)
{
cout<<"String & operator =(const String &)"<<endl;
this->~String();
pstr_=new char[strlen(s.pstr_)+1];
strcpy(pstr_,s.pstr_);
return *this;
}
String & String::operator =(const char *s)
{
cout<<"String & operator=(const char *)"<<endl;
this->~String();
pstr_=new char[strlen(s)+1];
strcpy(pstr_,s);
return *this;
}
String & String::operator +=(const String &s)
{
cout<<"String & operator += (const String &)"<<endl;
int len1=strlen(this->pstr_);
int len2=strlen(s.pstr_);
char *a=(char*)calloc(len1,sizeof(char));
strcpy(a,this->pstr_);
this->~String();
this->pstr_=new char[len1+len2+1];
sprintf(this->pstr_,"%s%s",a,s.pstr_);
return *this;
}
String & String::operator += (const char *s)
{
cout<<"String & operator += (const char *)"<<endl;
int len1=strlen(this->pstr_);
int len2=strlen(s);
char *a=(char*)calloc(len1,sizeof(char));
strcpy(a,this->pstr_);
this->~String();
this->pstr_=new char[len1+len2+1];
sprintf(this->pstr_,"%s%s",a,s);
return *this;
}
std::ostream & operator<<(std::ostream & os,const String &s)
{
cout<<"std::ostream & operator << (std::ostream & ,const String &)"<<endl;
os<<s.pstr_;
return os;
}
char& String::operator[] (std::size_t index)
{
cout<<"char & operator[] (std:: size_t index)"<<endl;
int len=strlen(this->pstr_);
char *a=(char*)calloc(len,sizeof(char));
strcpy(a,pstr_);
return a[index];
}
|
const char& String::operator[](std::size_t index)const
{
cout<<"const char & operator[] (std:: size_t index)const"<<endl;
int len=strlen(this->pstr_+1); //这里错了,this->pstr_+1相当于指正偏移到下一个字符
char *a=(char*)calloc(len,sizeof(char));
strcpy(a,pstr_);
return a[index];
}
std::size_t String::size()const
{
cout<<"std::size_t size()const"<<endl;
int len=strlen(this->pstr_);
return len;
}
const char* String::c_str() const
{
cout<<"const char* c_str() const"<<endl;
int len=strlen(this->pstr_+1);
char *a=(char*)calloc(len,sizeof(char));
//这里不管申请多大的空间,后面拷贝函数如果不够他都会自动在申请空间所以结果没出现错误
strcpy(a,pstr_);
return a;
}
bool operator == (const String & a1,const String &a2)
{
cout<<"bool operator == (const String &,const String &)"<<endl;
if((strcmp(a1.c_str(),a2.c_str()))==0)
return 1;
return 0;
}
bool operator != (const String & a1,const String & a2)
{
cout<<"bool operator != (const String &,const String &)"<<endl;
if((strcmp(a1.c_str(),a2.c_str()))!=0)
return 1;
return 0;
}
bool operator < (const String &a1,const String &a2)
{
cout<<"bool operator < (const String &,const String &)"<<endl;
if((strcmp(a1.c_str(),a2.c_str()))<0)
return 1;
return 0;
}
bool operator > (const String &a1,const String &a2)
{
cout<<"bool operator > (const String &,const String &)"<<endl;
if((strcmp(a1.c_str(),a2.c_str()))>0)
return 1;
return 0;
}
bool operator <= (const String &a1,const String &a2)
{
cout<<"bool operator <= (const String &,const String &)"<<endl;
if((strcmp(a1.c_str(),a2.c_str()))<0)
return 1;
else if((strcmp(a1.c_str(),a2.c_str()))==0)
return 1;
return 0;
}
bool operator >= (const String &a1,const String &a2)
{
cout<<"bool operator >= (const String &,const String &)"<<endl;
if((strcmp(a1.c_str(),a2.c_str()))>0)
return 1;
else if((strcmp(a1.c_str(),a2.c_str()))==0)
return 1;
return 0;
}
std::istream & operator >> (std::istream & is,String &s)
{
cout<<"std::istream & operator >> (std::istream &m,String &)"<<endl;
is>>s.pstr_;
return is;
}
String operator + (const String &a1,const String &a2)
{
cout<<"String operator + (const String &,const String &)"<<endl;
String tmp=a1;
tmp+=a2;
return tmp;
}
String operator + (const String &a1,const char * a2)
{
cout<<"String operator + (const String &,const char *)"<<endl;
String tmp=a1;
tmp+=a2;
return tmp;
}
String operator + (const char *a1,const String & a2)
{
cout<<"String operator + (const char *,const String &)"<<endl;
String tmp;
tmp+=a1;
tmp+=a2;
return tmp;
}
//测试代码
int main()
{
String s;
String s1("hello");
String s2(s1);
String s3="world";
s1=s2;
String s4;
s4="wangdao";
s+=s3;
s4+="nihao";
cout<<s4<<endl;
cout<<s4[2]<<endl;
cout<<s4.size()<<endl;
cout<<s4.c_str()<<endl;
bool bool1=(s1>s4);
cout<<bool1<<endl;
bool bool2=(s1>=s3);
cout<<bool2<<endl;
cin>>s;
cout<<s<<endl;
String s5=s1+s2;
cout<<s5<<endl;
String s6=s1+"shenzhen";
cout<<s6<<endl;
String s7="shenzhen1"+s1;
cout<<s7<<endl;
return 0;
}
|
String类运算符重载,自己实现的更多相关文章
- c++类运算符重载遇到的函数形参问题
class A { public: A(int arg1, int arg2); ~A(); A &operator = ( A &other); A operator + ( A & ...
- 从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载
在前面文章中使用过几次String类的例子,现在多重载几个运算符,更加完善一下,并且重载流类运算符. []运算符重载 +运算符重载 +=运算符重载 <<运算符重载 >>运算符重 ...
- 完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载
在前面文章中使用过几次String类的例子,现在多重载几个运算符,更加完善一下,并且重载流类运算符. []运算符重载 +运算符重载 +=运算符重载 <<运算符重载 >>运算符重 ...
- 04737_C++程序设计_第9章_运算符重载及流类库
例9.1 完整实现str类的例子. #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> ...
- 【C++札记】实现C++的string类
C++有了string类使得操作字符串变得很方便.有关string类,面试过程中也经常问到的就是自己实现一个sring类.下边实现个String类供大家参考: String.h #pragma onc ...
- 深入C++05:运算符重载
运算符重载 1.复数类 运算符重载目的:使对象运算表现得和编译器内置类型一样: 复数类例子 #include<iostream> using namespace std; class CC ...
- C++:String类
String类 1.使用String类必须在程序的开始包括头文件string,即要有如下语句:#include<string> 2.string类字符串对象的使用方法与其他对象一样stri ...
- C++中的运算符重载练习题
1.RMB类 要求: 定义一个RMB类 Money,包含元.角.分三个数据成员,友元函数重载运算符‘+’(加) 和 ‘-’(减),实现货币的加减运算 例如: 请输入元.角 分: ...
- 包装类、基本数据类型及String类之间的相互转换
包装类:8种基本数据类型对应一个类,此类即为包装类 一.基本数据类型 包装类 及String之间的转换 1.基本数据类型转化为包装类:调用包装类的构造器 int i=10; Inte ...
随机推荐
- Ubuntu安装samba实现文件夹共享
因工作需要,准备在Ubuntu服务器上共享文件夹,从Windows和Mac上都可以访问共享文件. 搜了一下,决定通过samba服务实现.安装过程如下: [step1]安装samba服务 sudo ap ...
- 3.1、Ubuntu系统中jmeter的安装和目录解析
以下内容亲测,如果不对的地方,欢迎留言指正,不甚感激.^_^祝工作愉快^_^ Jmeter是一个非常好用的压力测试工具. Jmeter用来做轻量级的压力测试,非常合适,只需要十几分钟,就能把压力测 ...
- 20145231熊梓宏 《网络对抗》 Bof逆向基础.shellcode注入
20145231网络对抗<逆向及Bof基础>shellcode注入 实验目的与要求 1.本次实践的对象是一个名为pwn1的linux可执行文件. 2.若该程序正常执行,则main函数会调用 ...
- .net 数据缓存(一)之介绍
现在的业务系统越来复杂,大型门户网站内容越来越多,数据库的数据量也越来愈大,所以有了“大数据”这一概念的出现.但是我们都知道当数据库的数据量和访问过于频繁都会影响系统整体性能体验,特别是并发量高的系统 ...
- shell脚本中使用什么工具进行计算
1.答: expr 2. expr的用法: jello=$(expr 1 \* 3) //乘法,注意1和expr之间有空格,1与转换符\之间有空格,3和*之间有空格 jello=$(expr 1 / ...
- Shell学习小结 - 深入认识变量
移动端访问不佳,请访问我的个人博客 变量的命名 对于初学者来说,可以简单的理解为,变量就是保存在计算机内存中的一系列的键值对. 列如: str="hello" 这里的str就是变量 ...
- Juniper SRX 简单命令一
Juniper为人所熟悉的一定是从netscreen开始的,作为一线防火墙品牌,还是有很高的地位.但是以前玩netscreen,都是用的网页版去配置,而且网页版做得很不错.但是现在netscreen要 ...
- Mysql binlog设置
一:Binlog文件信息 1. binlog基本定义:二进制日志,也成为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中: 2. 作用:MySQL的作用类似于Ora ...
- 动态规划dp专题练习
貌似开坑还挺好玩的...开一个来玩玩=v=... 正好自己dp不是很熟悉,就开个坑来练练吧...先练个50题?小目标... 好像有点多啊QAQ 既然是开坑,之前写的都不要了! 50/50 1.洛谷P3 ...
- NAT模式下远程连接centos6虚拟机与虚拟机网络配置
最近装了centos,但是没有网络,也无法远程连接.关键是虚拟机中没有ip地址. 网上方法很多,但是每个人情况不一样,所以不尽适用. 1.解决这个问题,首先保证你的vmware的dhcp服务和net服 ...