实例介绍
【实例简介】
自己动手写一个String实例,可实现基本的读写,查找,比较等等功能
【实例截图】
【核心代码】
#define _CRT_SECURE_NO_WARNINGS
#define _CRTDBG_MAP_ALLOC
#include <iostream>
#include<istream>
#include<ostream>
#include <crtdbg.h> //用于检测内存泄漏
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif // _DEBUG
using namespace std;
class MyString
{
public:
//默认无参构造
MyString();
//构造函数
MyString(int len);
MyString(const char* s);
MyString(char c, int n);
MyString(const MyString& s);
//重载>>运算符,只能在类外实现
friend ostream& operator<<(ostream& os, MyString& s);
//重载<<运算符,只能在类外实现
friend istream& operator>>(istream& is, MyString& s);
//重载==运算符,类外实现
friend bool operator==(const MyString& s1, const MyString& s2);
//重载()运算符
MyString& operator()(const MyString& str);
//重载=运算符
MyString operator=(const MyString& str);
//重载 运算符
MyString operator (const MyString& str);
//重载[]运算符
char& operator[](int index);
//重载<运算符
bool operator<(const MyString& str2);
//重载<=运算符
bool operator<=(const MyString& str2);
//重载>运算符
bool operator>(const MyString& str2);
//重载>=运算符
bool operator>=(const MyString& str2);
//字符寻址函数
int FindChar(char s);
//长度检测函数
int length()const;
//字符串插入函数
void insert(int p0, const char* s);
//子串截取函数
MyString substr(int pos, int n) const;
//字符串交换函数
void swap(MyString& s);
//析构函数
~MyString();
private:
//长度
int len;
//S指针
char* str;
};
//默认构造函数
MyString::MyString()
{
this->len = 0;
this->str = NULL;
}
//构造函数
MyString::MyString(int len)
{
//如果传入的len不合理
if (len <= 0)
{
this->len = 0;
this->str = NULL;
return;
}
//如果传入的len合理
else
{
this->len = len;
this->str = new char[this->len 1];
}
}
//构造函数
MyString::MyString(const char* s)
{
if (s == NULL)
{
this->len = 0;
this->str = new char[0 1];
strcpy(this->str, "");
}
else
{
this->len = strlen(s);
this->str = new char[this->len 1];
strcpy(this->str, s);
}
}
//构造函数
MyString::MyString(char c, int n)
{
this->len = n;
this->str = new char[n 1];
int i;
for (i = 0; i < n; i) {
*(this->str i) = c;
}
*(this->str i) = '\0';
}
//构造函数
MyString::MyString(const MyString& s)
{
this->len = s.len;
this->str = new char[this->len 1];
strcpy(this->str, s.str);
}
//重载==运算符,类外实现,重载为友元函数
bool operator==(const MyString& s1, const MyString& s2)
{
if (s1.len != s2.len) return false;
else {
for (int i = 0; i < s1.len; i) {
if (*(s1.str i) == *(s2.str i)) continue;
else {
return false;
break;
}
}
return true;
}
}
//重写()运算符,返回的是MyString &
MyString& MyString::operator()(const MyString& s)
{
if (this->str != NULL)
{
this->len = 0;
delete this->str;
this->str = NULL;
}
this->len = s.len;
this->str = new char[this->len 1];
strcpy(this->str, s.str);
return *this;
}
//重写=运算符返回的是MyString &
MyString MyString::operator=(const MyString& s)
{
if (this == &s)
{
return *this;
}
if (this->str != NULL)
{
this->len = 0;
delete this->str;
this->str = NULL;
}
this->len = s.len;
this->str = new char[this->len 1];
strcpy(this->str, s.str);
return *this;
}
//重写 运算符,返回的是匿名对象
MyString MyString::operator (const MyString& s)
{
int Len = this->len s.len;
MyString temp(Len);
strcpy(temp.str, this->str);
strcat(temp.str, s.str);
return temp;
}
//重写[]运算符,返回的是char的引用
char& MyString::operator[](int index)
{
if (index > this->len - 1)
{
return this->str[this->len - 1]; //如果超出引索范围,则默认返回最后一个字符
}
return this->str[index];
}
//重载<运算符
bool MyString::operator<(const MyString& str2)
{
int i = 0;
i = strcmp(this->str, str2.str );
if (i >= 0) return false;
else return true;
}
//重载<=运算符
bool MyString::operator<=(const MyString& str2)
{
int i = 0;
i = strcmp(this->str, str2.str);
if (i > 0) return false;
else return true;
}
//重载>运算符
bool MyString::operator>(const MyString& str2)
{
int i = 0;
i = strcmp(this->str, str2.str);
if (i <= 0) return false;
else return true;
}
//重载>=运算符
bool MyString::operator>=(const MyString& str2)
{
int i = 0;
i = strcmp(this->str, str2.str);
if (i < 0) return false;
else return true;
}
//字符寻址函数,若能找到字符,则返回引索值,否则返回-1
int MyString::FindChar(char s)
{
for (int i = 0; i < len; i) {
if (*(str i) == s) {
return i;
}
}
return EOF;
}
//析构函数
MyString::~MyString()
{
if (this->str != NULL)
{
delete str;
str = NULL;
this->len = 0;
}
}
//重写<<运算符,返回的是ostream &
ostream& operator<<(ostream& os, MyString& s)
{
//输出字符串
os << s.str;
return os;
}
//重写<<运算符,返回的是istream &
istream& operator>>(istream& is, MyString& s)
{
if (s.str != NULL)
{
delete s.str;
s.str = NULL;
s.len = 0;
}
char temp[4096] = { 0 };
is >> temp;
int len = strlen(temp);
s.str = new char[len 1];
strcpy(s.str, temp);
s.len = len;
return is;
}
//长度检测函数
int MyString::length() const
{
return this->len;
}
//字符串插入函数
void MyString::insert(int p0, const char* s)
{
char* temp;
temp = new char[this->len strlen(s) 1];
int i = 0;
for (i = 0; i < p0; i)
{
*(temp i) = *(this->str i);
}
for (i = p0; i < p0 strlen(s); i)
{
*(temp i) = *(s i - p0);
}
for (i = p0 strlen(s); i < this->len strlen(s) 1; i)
{
*(temp i) = *(this->str i - strlen(s));
}
delete[] this->str;
this->str = temp;
}
//子串截取函数
MyString MyString::substr(int pos, int n) const
{
char* temp;
temp = new char[n 1];
for (int i = pos; i < pos n; i)
{
*(temp i - pos) = *(this->str i);
}
*(temp n) = '\0';
MyString t(temp); //创建一个临时的MyString对象,然后释放temp的空间,防止内存泄漏
delete[] temp;
return t;
}
//字符串交换函数
void MyString::swap(MyString& s)
{
char* temp;
temp = this->str;
this->str = s.str;
s.str = temp;
}
int main()
{
//检测内存情况,若出现异常,则输出详细的内存泄漏报告
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
//测试MyString的基本构造功能
MyString s1("123");
cout << "s1:" << s1 << endl;
MyString s2("abc");
cout << "s2:" << s2 << endl;
MyString s3(s1);
cout << "s3:" << s3 << endl;
MyString s4 = s2;
cout << "s4:" << s4 << endl;
MyString s5 = s1 s2 s3;
cout << "s5:" << s5 << endl;
s5[1] = 'a'; //测试单个字符替换的功能
cout << "s5:" << s5 << endl;
MyString s6('s', 5);
cout << s6 << endl << endl << endl;
//测试重载I/O流的功能
cout << "输入新的s1和s5,中间以空格隔开,例如:789 abc" << endl;
cin >> s1 >> s5;
cout << "s1:" << s1 << endl;
cout << "s5:" << s5 << endl;
cout << "s1与s5相等吗? "<<(s1 == s5) << endl << endl << endl; //调用重载后的==运算符,比较二者
//测试插入函数
MyString s7 = "abc";
char test[5] = { '1','2'};
s7.insert(2, test);
cout << "s7: "<< s7 << endl << endl << endl;
//测试字符串截取函数
MyString s8 = "abcdefghijklmn";
MyString s9 = s1.substr(1, 3);
cout << "从s8截取后得到的s9为: " << s9 << endl << endl << endl;
//测试字符串交换函数
s8.swap(s9);
cout << "交换s8,s9后" << s9 << endl << endl << endl;
//测试引索功能
cout << "输入一个引索,找出 s1 对应位置的字符:" << endl;
int i;
cin >> i;
cout << "Char at s1 " << i << " is : " << s1[i] << endl;
char tests;
cout << "输入一个字符,查找之:" << endl;
cin >> tests;
cout << tests << " at s1 " << s1.FindChar(tests) << endl << endl << endl;
//字符串比较运算符重载测试
MyString s10("abc"), s11("abd");
cout << "s10 < s11 ? " << (s10 < s11) << endl;
cout << "s10 <= s11 ? " << (s10 <= s11) << endl;
cout << "s10 > s11 ? " << (s10 > s11) << endl;
cout << "s10 >= s11 ? " << (s10 >= s11) << endl << endl << endl;
//暂停,显示结果
cout << "测试完成!!!" << endl;
system("pause");
return 0;
}
标签:
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论