这也是部分。
原地址:猴子技术宅---https://www.ctvol.com/c-cyuyankaifa/523968.html
#include "stdafx.h"
#include <cstdio>
//构造函数(默认)
Mystring::Mystring(const char* str = NULL){
if (str == NULL){
//开辟内存空间
_str = new char[1];
*_str = '\0';
}
else{
int len = strlen(str);
//加1为'\0'申请内存空间
_str = new char[len + 1];
//(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC)能自动检测是否越界
strcpy_s(_str, len + 1, str);
}
}
//拷贝构造函数
Mystring::Mystring(const Mystring & another){
int len = strlen(another._str);
_str = new char[len + 1];
strcpy_s(_str, len + 1, another._str);
}
//运算符重载 =(赋值)
Mystring & Mystring::operator = (const Mystring & another){
//自赋值,出现错误
if(this == &another){
return *this;
}
//先删除自己开辟的空间
Mystring::~Mystring();
//获取another字符长度
int len = strlen(another._str);
//开辟内存空间+1 '\0'
this->_str = new char[len + 1];
//将another数据赋值给开辟的空间里面
strcpy_s(this->_str, len + 1, another._str);
//*_str
return *this;
}
//运算符重载 +(加法)
Mystring Mystring::operator + (const Mystring & another){
//第一种方法
int len = strlen(this->_str) + strlen(another._str);
//Mystring str;
//delete []str._str;
//str._str = new char[len + 1];
//零时开辟空间
char *p = new char[len +1];
//将开辟的内存空间填充为0
memset(p, 0, len + 1);
//将目标字符串衔接到开辟的空间中
strcat_s(p, strlen(this->_str) + 1 , this->_str);
//源字符串长度+目标字符串长度+结束符
int len_one = strlen(this->_str) + strlen(another._str) + 1;
//int len_two = strlen(another._str) + 1;
strcat_s(p, len_one, another._str);
//http://blog.csdn.net/xiaobin_hlj80/article/details/20136283
//介绍strcat_s合并2个字符串
return p;
////第二种方法:
//int i = 0, j =0;
////计算长度
//int len = strlen(this->_str) + strlen(another._str);
////申请临时内存空间
//char* p = new char[len+1];
////将申请的内存空间填充为0
//memset(p, 0, len + 1);
////遍历赋值
//while (this->_str[i] != '\0'){
// p[j++] = this->_str[i++];
//}
//cout << j <<endl;
//i = 0;
//while(another._str[i] != '\0'){
// p[j++] =another._str[i++];
//}
//return p;
}
//关系运算符重载 >
bool Mystring::operator > (const Mystring & another){
if (strcmp(this->_str, another._str) > 0){
return true;
}
else{
return false;
}
}
//关系运算符重载 <
bool Mystring::operator < (const Mystring & another){
if(strcmp(this->_str, another._str) < 0 ){
return true;
}
else{
return false;
}
}
//关系运算符重载 ==
bool Mystring::operator == (const Mystring & another){
if (strcmp(this->_str, another._str) == 0){
return true;
}
else{
return false;
}
}
//输入流重载 >>
istream & operator >>(istream &in , Mystring &another){
return in >> another._str ;
}
//输出流重载 <<
ostream & operator <<(ostream &out ,const Mystring &another){
return out << another._str << endl;
}
//申请内存重载
void* Mystring::operator new(size_t size){
return malloc(size);
}
//new[]重载
void* Mystring::operator new[](size_t size){
return malloc(size);
}
//删除申请的内存
void Mystring::operator delete(void* p){
return delete p;
}
//delete[]
void Mystring::operator delete[](void* p){
return delete []p;
}
//查找字符,在字符串第几个
//类,查找的字符
/*
char Mystring::find(const Mystring & p, char data){
//字符串长度
//abcd'\0' c 总长度5
//strchr查找data在_str中的位置sdfa
//查出的是data开始到最后fa
char* ptr = strchr(p._str,data);
// ptr = fa _str = sdfa
//int leng = strlen(_str); //4
//int leng2= strlen(ptr); //2
int pos = ptr - p._str ; //2
if (p._str){
//cout << ptr << " "<< leng2 << endl;
cout << data << "在"<<p._str << "中的第" << pos+1 << "个" << endl;
}
else{
printf("not find\n");
}
return data;
}*/
char Mystring::find(char data){
//字符串长度
//abcd'\0' c 总长度5
//strchr查找data在_str中的位置sdfa
//查出的是data开始到最后fa
//char* ptr = strchr(this->_str,data);
//int pos = ptr - this->_str ; //2
//if (this->_str){
// //cout << ptr << " "<< leng2 << endl;
// cout << this->_str << "中的第" << pos+1 << "个" << endl;
//}
//else{
// printf("not find\n");
//}
int leng = strlen(this->_str);
for (int i = 0;i < leng;i++){
if (this->_str[i] == data){
cout << data << "在"<< this->_str << "中的第" << i+1 << "个" << endl;
}
}
return data;
}
////替换第几个字符;
//pos开始的num个字符,字符
char Mystring::replace(int pos, int num,char data){
// 0 ->5 第5个
//abcdef 3 ->5
//Mystring str;
int leng = num + pos;
int leng1 = strlen(this->_str);
if (leng > leng1){
cout << "你的有点长,表示计算机,爱莫能助" << endl;
return 0;
}
for (int i = 0;i <= leng;i++){
if(i == leng){
cout << this->_str[i] << endl;
_str[i] = data;
//delete [i]_str;
break;
}
}
cout << this->_str << endl;
}
//[]运算符重载
char& Mystring::operator[](int idx){
return _str[idx];//数组下标
}
//打印输出
void Mystring::format(){
for (size_t i = 0; i<strlen(this->_str); i++){
cout << _str[i];
}
cout << endl;
}
//析构函数__释放对象开辟的资源空间
Mystring::~Mystring(){
delete []_str; //释放
}
本文详细介绍了如何使用C++实现自定义字符串类Mystring,包括构造函数、拷贝构造函数、运算符重载等功能,并展示了如何进行字符串连接、比较等操作。
967

被折叠的 条评论
为什么被折叠?



