C++ 自定义实现MyString类
来源:互联网 发布:新开的淘宝店如何推广 编辑:程序博客网 时间:2024/06/06 02:54
学习了C++ 的特性:
封装、继承、多态,老师让根据String库,实现String的功能,通过用重载实现符号的功能。
此文实现了
具体来看代码:
mystring.h
#ifndef _MYSTRING_H_#define _MYSTRING_H_#include <iostream>#include <cstdio>#include <cstring>#include <malloc.h> //申请空间使用using namespace std;class MyString{private: char* m_data; size_t length;//长度public: char* getStr(); //获取字符串 MyString(); //无参构造函数 MyString(const char* str);//有参构造函数 MyString(const MyString &strcla);//拷贝构造函数 MyString(int n,char ch);//由n个ch字符组成的字符串 //s[n] char getStrChar(const int n);//获取字符串第n个字符 //s.size() 字符串的长度 int size()const { return strlen(m_data); } //s.empty 判断是不是空 此处用的是内联函数 bool empty(); MyString& operator =(const MyString& other);//重载= bool operator >(const MyString& other)const;//大于0 bool operator <(const MyString& other)const;//小于0 bool operator >=(const MyString& other)const;//大于或者等于0 bool operator <=(const MyString& other)const;//小雨或者等于0 bool operator ==(const MyString& other)const; MyString operator +(const MyString& other);//字符串相加 ~MyString();//析构函数 //友元函数 friend istream& operator >>(istream& is,const MyString& str); friend ostream& operator <<(ostream& os,const MyString& str);//重载[] char& operator [](int n)const{ if(n>=size()) { return m_data[size()-1]; } else { return m_data[n]; }}};#endif
定义类
mystring.cpp
#include "mystring.h"MyString::MyString(){ this->m_data = new char[1]; *(this->m_data) = '\0';}char* MyString::getStr(){ return this->m_data;}MyString::MyString(const char* str){ if(str==NULL) { this->m_data = new char[1]; *(this->m_data) = '\0'; }else {#if 0 int i = 0; while(m_data[i]!='\0') { m_data[i]=str[i]; i++; } m_data[i]='\0'; #endif int length = strlen(str); m_data = new char[length+1]; strcpy(m_data,str); }}MyString::MyString(const MyString &strcla){ int length = strlen(strcla.m_data); this->m_data = new char[length+1]; strcpy(this->m_data,strcla.m_data);}MyString::~MyString(void){ delete[] this->m_data;}MyString::MyString(int n,char ch){ int i=0; m_data = new char[1]; for(;i<n;i++) { m_data[i]=ch; } m_data[n]='\0';}MyString& MyString::operator =(const MyString &other){ if(this==&other) return *this; delete[] m_data; int length = strlen(other.m_data); m_data = new char[length+1]; strcpy(m_data,other.m_data); return *this;} //s[n] char MyString::getStrChar(const int n) { char ch ='\0'; if(n<=0){ cout<<"输入的位置不正确!"<<endl; }else{ int i = 0; for(;i<this->size();i++) { if(i==(n-1)) { ch = m_data[i]; break; } } } return ch; } //s.empty bool MyString::empty() { bool bo = false; if(this->size()<=0) { bo = true; } return bo; } bool MyString::operator >(const MyString& other)const//大于0 { bool is_ok = false; unsigned int i = 0; for(;i<strlen(m_data);i++) { if(m_data[i]>other.m_data[i]) { is_ok = true; break; } } return is_ok; } bool MyString::operator <(const MyString& other)const//小于0 { bool is_ok = false; unsigned int i = 0; for(;i<strlen(m_data);i++) { if(m_data[i]<other.m_data[i]) { is_ok = true; break; } } return is_ok; } bool MyString::operator >=(const MyString& other)const//大于或者等于0 { bool is_ok = false; unsigned int i = 0; for(;i<strlen(m_data);i++) { if(m_data[i]>other.m_data[i]||m_data[i]==other.m_data[i]) { is_ok = true; break; } } return is_ok; } bool MyString::operator <=(const MyString& other)const//小于或者等于0 { bool is_ok = false; unsigned int i = 0; for(;i<strlen(m_data);i++) { if(m_data[i]<other.m_data[i]||m_data[i]==other.m_data[i]) { is_ok = true; break; } } return is_ok; }bool MyString::operator ==(const MyString& other)const{ bool is_ok = true; if(strlen(m_data)!=strlen(other.m_data)) { is_ok=false; }else { unsigned int i = 0; for(;i<strlen(m_data);i++) { if(m_data[i]!=other.m_data[i]) { is_ok = false; break; } } } return is_ok;}MyString MyString::operator +(const MyString& other)//字符串相加{ int size = this->size()+ other.size(); char *s = (char*)malloc(sizeof(char)*size); int i = 0; int si = this->size(); for(;i<si;i++) { s[i]=m_data[i]; } int j = 0; int osi = other.size(); for(;j<osi;j++) { s[i+j]=other.m_data[j]; } s[i+j]='\0';//字符串结尾 return MyString(s);}//重载输出运算符ostream& operator << (ostream& os,const MyString& str){ unsigned int i = 0; for(;i<strlen(str.m_data);++i) { os << str.m_data[i]; } return os;}//重载输入运算符istream& operator >> (istream& is,const MyString& str){ char ch; unsigned int i = 0; while(1) { is >> noskipws;//noskipws => no skip whitespace(空白) //noskipws 不是不忽略输入前的空格, 而是 不忽略 任意地方的空格 is >> ch; if( ch == '\n') { break; } else { str.m_data[i]=ch; i++; } } str.m_data[i]='\0'; return is;}
测试运行类
mainstr.cpp
#include "mystring.h"int main(int argc,char* argv[]){// char* str1 = "abcdefghigklmnopqrstuvwxyz"; MyString str0("abcdefghigklmnopqrst"); cout<<"str1:"<<str0.getStr()<<endl; MyString ms1; cout<<"ms1:"<<ms1.getStr()<<endl; MyString ms2(str0); cout<<"ms2:"<<ms2.getStr()<<endl; MyString ms3("abcdefg"); cout<<"ms3:"<<ms3.getStr()<<endl; MyString s4 = "s4123sddfjk"; cout<<"s4:"<<s4.getStr()<<endl; MyString ms5(6,'a'); cout<<"s5:"<<ms5.getStr()<<endl; MyString ms6 = "abc"; MyString ms7 = "adc"; if(ms6==ms7){ cout<<"ms6==ms7:"<<endl; } else{ cout<<"ms6!=ms7:"<<endl; } MyString ms9 = MyString("12345767"); cout<<"ms6.size():"<<ms9.size()<<endl; MyString s8 = ms6+ms7; cout<<"ms6+ms7:"<<s8.getStr()<<endl; MyString str1(ms9); cout<< "str1:"<<str1<<endl; cout<<str1.getStr(); cout << endl << endl; MyString str2; str2 = ms6; cout<< "str2:"<<str2<<endl; cout<<str2.getStr(); cout << endl << endl; //第几位的字符 cout<<str2.getStrChar(3)<<endl; // 判断是不是空的 if(str2.empty()) { cout<<"empty"<<endl; }else { cout<<"no empty"<<endl; } //重载[] cout<<"str2[2]:"<<str2[2]<<endl; return 0;}
上图运行结果
欢迎大家评论回复;
如有问题可以联系 QQ:976968684
阅读全文
0 0
- C++ 自定义实现MyString类
- 自定义字符串类MyString的C++实现
- MyString类实现
- MyString类的实现
- mystring类的实现
- 自定义MyString()
- 实现MyString类(二)—MyString.cpp实现
- 【15】实现一个MyString类
- C++之实现MyString类
- C++之实现MyString类
- 实现MyString类(一)—类声明mystring.h
- mystring实现
- MyString实现
- MyString实现
- 串——自定义MyString类
- 【c++】自己编写MyString类实现C++中String类功能
- 重学C++Primer笔记11---类的四个合成和MyString类的实现
- C++ MyString类的简单实现
- hive 查询结果压缩
- 有10个资源,10个线程,如何保证不会出现死锁?
- 初识redis
- hive shell的入口
- [JAVA]数组旋转输出
- C++ 自定义实现MyString类
- ssd-tensorflow实现
- GeoHash在matlab中工具包编写
- 网易2018校园招聘第3题
- 图像处理
- MATLAB下载安装
- LEDE(openwrt) 树莓派3 raspberry pi3 配置为路由器router(含IPv6)
- arm看门狗的作用
- hdu 6186 CS Course (前缀+后缀)