字符串的运算符重载(如:赋值‘=’、加'+'、加等'+='、下标'[]'相等'=='、不等'!='、大于'>'、输出运算符'<<'以及类型转换)
来源:互联网 发布:中国最牛的程序员 编辑:程序博客网 时间:2024/06/06 03:54
#include<iostream>
#include<string.h>
using namespace std;
class STR
{
public:
STR(char *str="") //字符串构造
{
m_str=new char[strlen(str)+1];
strcpy(m_str,str);
}
STR(char c) //字符构造
{
m_str=new char[2];
m_str[0]=c;
m_str[1]='\0';
}
STR(char c,int n) //n个相同字符构造
{
m_str=new char[n+1];
memset(m_str,c,n);
m_str[n]='\0';
}
STR(STR &s) //拷贝构造函数
{
m_str=new char[strlen(s.m_str)+1];
strcpy(m_str,s.m_str);
}
~STR() //析构函数
{
if(m_str!=NULL)
{
delete []m_str;
m_str=NULL;
}
}
STR& operator=(STR &s) //对象与对象的赋值
{
if(this==&s)
return *this;
if(m_str!=NULL)
delete []m_str;
m_str=new char[strlen(s.m_str)+1];
strcpy(m_str,s.m_str);
return *this;
}
STR& operator=(char *str) //字符串赋值给对象
{
if(m_str!=NULL)
delete []m_str;
m_str=new char[strlen(str)+1];
strcpy(m_str,str);
return *this;
}
STR& operator=(char c) //字符赋值给对象
{
if(m_str!=NULL)
delete []m_str;
m_str=new char[2];
m_str[0]=c;
m_str[1]='\0';
return *this;
}
STR operator+(STR &s) //两个对象相加
{
char *p=new char[strlen(m_str)+strlen(s.m_str)+1];
strcpy(p,m_str);
strcat(p,s.m_str);
STR t=p;
delete []p;
p=NULL;
return t;
}
STR& operator+=(STR &s) //两个对象相加,并将结果放入第一个对象中
{
char *p=new char[strlen(m_str)+strlen(s.m_str)+1];
strcpy(p,m_str);
strcat(p,s.m_str);
if(m_str!=NULL)
delete []m_str;
m_str=new char[strlen(m_str)+strlen(s.m_str)+1];
strcpy(m_str,p);
delete []p;
p=NULL;
return *this;
}
char& operator[](int n) //重载下标
{
if(n>=0 && n<strlen(m_str))
return m_str[n];
}
bool operator==(STR &s)
{
return strcmp(m_str,s.m_str)==0;
}
bool operator!=(STR &s)
{
return !(*this==s);
}
bool operator>(STR &s)
{
return strcmp(m_str,s.m_str)==1;
}
operator char*()
{
return m_str;
}
friend ostream& operator<<(ostream &out,STR &s);
void print()
{
cout<<m_str<<endl;
}
private:
char *m_str;
};
ostream& operator<<(ostream &out,STR &s)
{
out<<s.m_str;
return out;
}
void main()
{
STR s("123456");
STR a(s); //调用拷贝构造
STR c('m');
STR b('a',3);
c=b; //赋值
s="safgv";
b='1';
a=s+b;
a+=s;
s.print();
a.print();
c.print();
b.print();
cout<<a[3]<<endl;
cout<<(a==b)<<endl;
cout<<(a!=b)<<endl;
cout<<(a>b)<<endl;
cout<<(char*)a<<endl;
#include<string.h>
using namespace std;
class STR
{
public:
STR(char *str="") //字符串构造
{
m_str=new char[strlen(str)+1];
strcpy(m_str,str);
}
STR(char c) //字符构造
{
m_str=new char[2];
m_str[0]=c;
m_str[1]='\0';
}
STR(char c,int n) //n个相同字符构造
{
m_str=new char[n+1];
memset(m_str,c,n);
m_str[n]='\0';
}
STR(STR &s) //拷贝构造函数
{
m_str=new char[strlen(s.m_str)+1];
strcpy(m_str,s.m_str);
}
~STR() //析构函数
{
if(m_str!=NULL)
{
delete []m_str;
m_str=NULL;
}
}
STR& operator=(STR &s) //对象与对象的赋值
{
if(this==&s)
return *this;
if(m_str!=NULL)
delete []m_str;
m_str=new char[strlen(s.m_str)+1];
strcpy(m_str,s.m_str);
return *this;
}
STR& operator=(char *str) //字符串赋值给对象
{
if(m_str!=NULL)
delete []m_str;
m_str=new char[strlen(str)+1];
strcpy(m_str,str);
return *this;
}
STR& operator=(char c) //字符赋值给对象
{
if(m_str!=NULL)
delete []m_str;
m_str=new char[2];
m_str[0]=c;
m_str[1]='\0';
return *this;
}
STR operator+(STR &s) //两个对象相加
{
char *p=new char[strlen(m_str)+strlen(s.m_str)+1];
strcpy(p,m_str);
strcat(p,s.m_str);
STR t=p;
delete []p;
p=NULL;
return t;
}
STR& operator+=(STR &s) //两个对象相加,并将结果放入第一个对象中
{
char *p=new char[strlen(m_str)+strlen(s.m_str)+1];
strcpy(p,m_str);
strcat(p,s.m_str);
if(m_str!=NULL)
delete []m_str;
m_str=new char[strlen(m_str)+strlen(s.m_str)+1];
strcpy(m_str,p);
delete []p;
p=NULL;
return *this;
}
char& operator[](int n) //重载下标
{
if(n>=0 && n<strlen(m_str))
return m_str[n];
}
bool operator==(STR &s)
{
return strcmp(m_str,s.m_str)==0;
}
bool operator!=(STR &s)
{
return !(*this==s);
}
bool operator>(STR &s)
{
return strcmp(m_str,s.m_str)==1;
}
operator char*()
{
return m_str;
}
friend ostream& operator<<(ostream &out,STR &s);
void print()
{
cout<<m_str<<endl;
}
private:
char *m_str;
};
ostream& operator<<(ostream &out,STR &s)
{
out<<s.m_str;
return out;
}
void main()
{
STR s("123456");
STR a(s); //调用拷贝构造
STR c('m');
STR b('a',3);
c=b; //赋值
s="safgv";
b='1';
a=s+b;
a+=s;
s.print();
a.print();
c.print();
b.print();
cout<<a[3]<<endl;
cout<<(a==b)<<endl;
cout<<(a!=b)<<endl;
cout<<(a>b)<<endl;
cout<<(char*)a<<endl;
}
运行结果:
阅读全文
1 0
- 字符串的运算符重载(如:赋值‘=’、加'+'、加等'+='、下标'[]'相等'=='、不等'!='、大于'>'、输出运算符'<<'以及类型转换)
- C++赋值运算符、函数调用运算符、下标运算符(“=”、“()”、“[]”)重载
- 重载赋值运算符=
- C++中几个特殊运算符的重载(= 、++、--、下标运算符的重载)
- 运算符重载——重载赋值运算符=用于字符串赋值
- C++ =赋值运算符的重载
- C++重载赋值运算符(=)
- 赋值和算术运算符的重载(1):赋值运算符 =
- 走进C++程序世界------操作符运算、操作符重载、转换运算符、双目元算、+=,-+运算符,比较运算符及下标运算符
- C++ 赋值运算符=重载
- c++运算符重载字符串想加
- 运算符重载:赋值、类型转换
- 区分一下强制类型转换运算符重载/赋值运算符重载/对象定义的赋值
- C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝
- C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝
- C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝
- C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝
- C++本质:类的赋值运算符=的重载,以及深拷贝和浅拷贝
- 谁知道静态成员的纠结心境
- Mac缓存清理软件谁更受欢迎
- 关于Java Web的<s:select>在编辑页面自动填值的问题
- 探索 ES8 Object.entries()
- Physically Based Deformable Models in Computer Graphics
- 字符串的运算符重载(如:赋值‘=’、加'+'、加等'+='、下标'[]'相等'=='、不等'!='、大于'>'、输出运算符'<<'以及类型转换)
- #ifndef/#define/#endif使用详解
- Oracle行列互换 横表和纵表
- SpringMVC访问不到静态资源的几种解决方法!
- Android多渠道(平台)打包
- python2.7 TK界面邮件发送(支持中文)
- 第8节-Linux增加、修改、删除、查看用户及组
- JAVA中URL传递中文参数,\%解析 取值是乱码的解决办法
- Android Studio