CPP-基础:String类
已知类String的原型为:
class String
{
public:
String(const char *str = NULL); // 普通构造函数
String(const String &other); // 拷贝构造函数
~ String(void); // 析构函数
String& operator =(const String &other); // 赋值函数
String& operator +(const String &other); //重载运算符+
String& operator -(const String &other); //重载运算符-
bool operator==(const String &other); //重载"==",判断两个字符串相等
bool operator<(const String &other);
bool operator>(const String &other);
friend ostream& operator << (ostream &, const String &); //重载<<,这里必须使用friend,因为涉及到两个类之间私有成员的访问 private:
char *m_data; // 用于保存字符串
};
普通构造函数
String::String(const char *str)
{
if(NULL==str)
{
m_data = new char[]; // 得分点:对空字符串自动申请存放结束标志'\0'的//加分点:对m_data加NULL 判断
if(m_data!=NULL)
{
*m_data = '\0';
}
}
else
{
int length = strlen(str);
m_data = new char[length+]; // 若能加 NULL 判断则更好
if(m_data!=NULL)
{
strcpy(m_data, str);
}
} }
String的析构函数
String::~String(void)
{
delete [] m_data; // 或delete m_data;
}
拷贝构造函数
String::String(const String &other) // 得分点:输入参数为const型
{
int length = strlen(other.m_data);
m_data = new char[length+]; //加分点:对m_data加NULL 判断
if(m_data!=NULL)
{
strcpy(m_data, other.m_data);
}
}
赋值函数
String& String::operator=(const String &other) // 得分点:输入参数为const型
{
if(this == &other) //得分点:检查自赋值
return *this;
delete [] m_data; //得分点:释放原有的内存资源
int length = strlen( other.m_data );
m_data = new char[length+];
//加分点:对m_data加NULL 判断
if(m_data!=NULL)
strcpy( m_data, other.m_data );
return *this; //得分点:返回本对象的引用
}
运算符重载+
String& String::operator+(const String &other)
{
char temp[];
strcpy(temp,m_data); //先把左侧串存放到临时数组。
int length1 = strlen(this->m_data); //保存左侧串的长度;
delete [] m_data; //删掉左侧串内存。
int length2 = strlen(other.m_data);//计算右侧串的长度。
int length = length1 + length2;//计算左右串总长度。
m_data=new char[length+];//把总长度+1,准备接纳拼接后的字符串。
if(m_data!=NULL)
{
strcpy(m_data,temp);
}
strcat(m_data,other.m_data);
return *this;
}
运算符重载 -
String& String::operator-(const String &other)
{
char *temp,*p;
if( (temp=strstr(m_data,other.m_data)) ==NULL)
{
cout<<"没有符合的子串,不能使用'-'操作"<<endl;
return *this;
}
else
{
p=temp;
temp=temp+strlen(other.m_data);
*p='\0'; //把“o.World!”第一个字符变为'\0',从而让m_data缩减为前半部。
strcat(m_data,temp);
}
return *this;
}
重载运算符"<<"
ostream& operator<<(ostream &output, const String &other)
{
output<<other.m_data;
return output;
}
重载运算符"<"
bool String::operator<(const String &other)
{
if(strcmp(m_data,other.m_data)<)
return true;
return false;
}
重载运算符">"
bool String::operator>(const String &other)
{
if(strcmp(m_data,other.m_data)>)
return true;
return false;
}
运算符重载 ==
bool String::operator==(const String &other)
{
if(strcmp(m_data,other.m_data)==)
return true;
return false;
}
void main()
{
String s1("Hello,"); //普通构造函数
String s2("World!"); //普通构造函数
String s3(s2);//调用拷贝构造函数
String s4(s2);//调用拷贝构造函数
String s5("Hello,World"); //普通构造函数
String s6("Hello,World!");//普通构造函数 String s7("Hello,World!");//普通构造函数
String s8("o,W"); //普通构造函数
String s9; //自动调用普通构造函数 //String s3;//调用构造函数中的默认构造.
//s3=s2;// 调用重载后的赋值函数 cout<<s1<<endl; //输出对象s1.m_data;
cout<<s2<<endl; //输出对象s2.m_data;
cout<<s3<<endl; //输出对象s3.m_data; s3=s1+s2; //调用运算符=重载函数 cout<<s1<<endl;
cout<<s2<<endl;
cout<<s3<<endl; if(s4==s2)
cout<<"两个字符串相等"<<endl;
else
cout<<"两个字符串不相等"<<endl; if(s5<s6)
cout<<"s5小于s6"<<endl;
else if(s5>s6)
cout<<"s5大于s6"<<endl;
else
cout<<"s5等于s6"<<endl; s9=s7-s8;
cout<<s9<<endl;
system("pause");
}
CPP-基础:String类的更多相关文章
- Java基础String类
String是一个对象 String不属于8种基本数据类型(byte, char, short, int, float, long, double, boolean),String是对象,所以其默认值 ...
- Java基础—String类小结
一.String类是什么 public final class String implements java.io.Serializable, Comparable<String>, Ch ...
- Java基础---String类和基本数据类型包装类
第一讲 String类 一.概述 String是字符串的类类型,用于描述字符串事物.字符串是一个特殊的对象.特殊之处就在于: Stings= new String();和Str ...
- Java基础——String类(二)
今天做了几道String常见操作.先来几个代码实例: 例一:此方法,仅把字符串前后出现的空格去掉了,中间部分不会. class TestTrim { public static void main(S ...
- Java基础——String类(一)
一.String 类代表字符串 Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串 ...
- 面向对象基础——String类
String类的两种实例化方法 A:直接赋值 public class StringDemo01{ public static void main(String args[]){ String na ...
- Java基础:String类详解,案例用户登录实现,案例手机号截取实现,案例敏感词替换实现;StringBuilder类详解,StringBuilder和String相互转换,附练习案例.
1.API 1.1 API概述-帮助文档的使用 什么是API API (Application Programming Interface) :应用程序编程接口 java中的API 指的就是 JDK ...
- [Java基础]——String类
此篇博客主要整理Java中的String类的使用. 一.String 1.1 String 的定义 上图是jdk中对String类的定义,得到的信息有: ①.String类声明为final的, ...
- Java基础——数组应用之字符串String类
字符串String的使用 Java字符串就是Unicode字符序列,例如串“Java”就是4个Unicode字符J,a,v,a组成的. Java中没有内置的字符串类型,而是在标准Java类库中提供了一 ...
- 【java 基础 9】原来我从没有了解过String类
导读:这两天没有做项目,然后就想着把之前在项目中用到过的东西总结总结.记得之前做今日开讲项目时,在比较学生学号的时候,我最开始用的是"==",但是,实践证明,这个玩意儿吧,总是很奇 ...
随机推荐
- HDOJ2579,BFS(三维数组标记)
三维数组对于我这个萌萌的新手来说真是酷酷的,帅到不行,,, 三维数组前面还看到空间的哪一题HDOJ1240,这一题时间上的标记,更酷了!!! 不说废话了,贴一发代码: #include <std ...
- [Xcode 实际操作]七、文件与数据-(16)解析XML文档
目录:[Swift]Xcode实际操作 本文将演示如何解析XML文档. 项目中已添加一份XML文档:worker.xml <?xml version="1.0" encodi ...
- 日志组件Log2Net的介绍和使用(附源码开源地址)
Log2Net是一个用于收集日志到数据库或文件的组件,支持.NET和.NetCore平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...
- 学习java设计模式的必要性探讨
1.设计模式是什么:设计模式为我们提供了一套可复用的面向对象技术,再配合重构方法,可以让我们避免简单重复的工作.它使用面向接口编程,而不是面向实现.可以说设计模式是java程序设计的灵魂. 2.为什么 ...
- AtCoder Beginner Contest 054 ABCD题
A - One Card Poker Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Ali ...
- Points on Plane Codeforces - 576C
https://www.luogu.org/problemnew/show/CF576C 看题面,一眼按莫队的方法排一下 直接交就会和我一样发现WA掉了... 算一下会发现,上限是3e9(块内左端点1 ...
- [已读]悟透JavaScript
这本书出的特别早,就第一部分内容还行,第一次看得时候觉得蛮有意思,讲禅的方式来讲javascript,作者造了一个"甘露模型"来实现继承,不过今天整理的时候,发现那些笔记都没多少可 ...
- Nodejs 定时任务
安装扩展:node-schedule npm install node-schedule 1.linux Crontab风格 var schedule = require('node-schedule ...
- HTML 5的革新——语义化标签(二)
HTML 5的革新之一:语义化标签二文本元素标签.分组元素标签. HTML 5的革新——语义化标签(一)中介绍了一些HTML5新加的一些节元素,一张页面中结构元素构成网页大体,但是也需要其他内容来填充 ...
- Linux-软件安装(一) —— jdk/tomact 安装(普通安装)
Linux-软件安装(一) -- jdk/tomact 安装(普通安装) 1. 可使用 FinalShell 上传至 Linux 服务器 2. 解压 cd /usr/local #解压命令 tar - ...