#include <iostream>
#include <cstring>
using namespace std; class String; class Data{ // 抽象基类Data
public:
virtual const int compareTo(const String& target) const = ; // virtual比较函数
}; class String: public Data{ // String类。继承自Data
public:
static int num_strings; // 程序周期内创建的String对象个数
static const int CINLIM = ; // 限制字符长度
String(); // 默认构造函数
String(unsigned int capacity); // 以大小为capacity来初始化
String(unsigned int capacity, char ch); // 填充字符为ch,大小为capacity
String(const char* target); // 以一个c风格字符串初始化
String(const String& st); // 拷贝构造函数
~String(){ delete ptr; ptr = nullptr;} // 析构函数
const int findSubStr(const char* substr) const; // 找出子串位置
const int findChar(char target) const; // 找出字符第一次出现位置
const int length() const; // 返回字符串大小
static int howManyExit(); // 返回程序周期内创建的String对象个数
const int compareTo(const String& target) const override; // 与其它String对象比较大小
String& operator=(const String&); // 重载赋值操作符
String& operator=(const char*); // 重载赋值操作符
friend String operator+(const String&,const String&) ; // 重载加号
char& operator[](int i); // 重载[]
const char& operator[](int i) const; // 重载[]
friend bool operator>(const String& st1,const String& st2); // 重载>
friend bool operator<(const String& st1,const String& st2); // 重载<
friend bool operator==(const String& st1,const String& st2); // 重载==
friend ostream& operator<<(ostream& os,const String& st); // 重载<<
friend istream& operator>>(istream& is,String& st); // 重载>>
private:
char* ptr; // 内置char数组指针
unsigned int len; // 当前String长度
}; int String::num_strings = ; // 静态变量初始化 String::String() { ptr = new char[]; len = ; } String::String(unsigned int capacity){
ptr = new char[capacity]; len = capacity;
++ num_strings;
} String::String(unsigned int capacity, char ch){
ptr = new char[capacity]; len = capacity;
for(int i=;i<len;i++)
ptr[i] = ch;
++ num_strings;
} String::String(const char* target){
int tmp = (int)strlen(target);
len = (unsigned)tmp;
ptr = new char[len];
strcpy(ptr,target);
++ num_strings;
} String::String(const String& st){
int tmp = (int)strlen(st.ptr);
len = (unsigned)tmp;
ptr = new char[len];
strcpy(ptr,st.ptr);
++ num_strings;
} const int String::findSubStr(const char* substr) const{
int next[];
next[] = -;
int i=,j=-;
int lenP = (int)strlen(substr);
while(i<lenP){
if(j==-||substr[i]==substr[j]){
++i; ++j;
next[i] = j;
}else
j = next[j];
}
i = ,j = ;
while(i<len&&j<lenP){
if(j==-|ptr[i]==substr[j]){
++i; ++j;
}else
j = next[j];
}
if(j==lenP) return len - j;
return -;
} const int String::findChar(char target) const{
for(int i=;i<len;i++)
if(ptr[i] == target) return i;
return -;
} const int String::length() const{
return this->len;
} int String::howManyExit(){
return num_strings;
} const int String::compareTo(const String& target) const{
if(target.ptr == nullptr || strcmp(ptr,target.ptr)>)
return ;
else if(strcmp(ptr,target.ptr)==)
return ;
else
return -;
} String& String::operator=(const String& str){
if(this == &str)
return *this;
delete ptr;
len = (int)strlen(str.ptr);
ptr = new char[len];
strcpy(ptr,str.ptr);
return *this;
} String& String::operator=(const char* str){
delete[] ptr;
len = (int)strlen(str);
ptr = new char[len+];
strcpy(ptr,str);
return *this;
} String operator+(const String& st1,const String& st2){
int lenSt2 = (int)strlen(st2.ptr);
int lenSt1 = (int)strlen(st1.ptr);
char* temp = new char[lenSt1+lenSt2+];
strcpy(temp,st1.ptr);
for(int i=lenSt1;i<lenSt1+lenSt2;i++)
temp[i] = st2.ptr[i-lenSt1];
return String(temp);
} char& String::operator[](int i){
return ptr[i];
}
const char& String::operator[](int i) const{
return ptr[i];
} bool operator<(const String& st1,const String& st2){
return (std::strcmp(st1.ptr,st2.ptr)<);
}
bool operator>(const String& st1,const String& st2){
return (std::strcmp(st1.ptr,st2.ptr)>);
}
bool operator==(const String& st1,const String& st2){
return (std::strcmp(st1.ptr,st2.ptr)==);
}
ostream& operator<<(ostream& os,const String& st){
os<<st.ptr;
return os;
}
istream& operator>>(istream& is,String& st){
char temp[String::CINLIM];
is.get(temp,String::CINLIM);
if(is)
st = temp; //在此处" = "已被重载过了
while(is && is.get()!='\n')
continue;
return is;
}
int main()
{
String A = "abcd";
String B = "efgh";
String C = A + B;
cout << C << endl;
}

转自:https://www.cnblogs.com/1Kasshole/archive/2018/07/28/9382828.html

自定义string类的更多相关文章

  1. C++基础 (5) 第五天 重载new delete () 只能操作符 自定义string类

    1 昨日回顾 1.static 对整个类共享 可以直接用 类::方法 调用 如果是私有的 可以提供一个静态的访问静态成员的方法 2 自定义的数组类-重载操作符[] 3 重载new和delete 4 重 ...

  2. 自定义String类,并且实现在STL容器中添加自定义的类型

    13.44 编写标准库string类的简化版本,命名String.你的类应该至少有一个默认构造函数和一个接受C风格字符串指针参数的构造函数.使用allocator为你的String类分配所需内存. 1 ...

  3. 使用引用计数和copy-on_write实现String类

    本文写于2017-01-18,从老账号迁移到本账号,原文地址:https://www.cnblogs.com/huangweiyang/p/6295420.html 这算是我开始复习的内容吧,关于st ...

  4. C++自定义String字符串类,支持子串搜索

    C++自定义String字符串类 实现了各种基本操作,包括重载+号实现String的拼接 findSubStr函数,也就是寻找目标串在String中的位置,用到了KMP字符串搜索算法. #includ ...

  5. java中 引用传递、值传递的理解(数组,自定义类,基本数据类型,String类)

    代码部分: public static void main(String[] args) { testInt(); testString(); testArray(); testX(); } publ ...

  6. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  7. 关于MapReduce中自定义分区类(四)

    MapTask类 在MapTask类中找到run函数 if(useNewApi){       runNewMapper(job, splitMetaInfo, umbilical, reporter ...

  8. kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件

    该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...

  9. java 28 - 4 JDK5的新特性 之 枚举的概述和自定义枚举类

    枚举 枚举概述 是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.举例:一周只有7天,一年只有12个月等. 回想单例设计模式:单例类是一个类只有一个实例 那么多例类就是一个类有多个实例,但 ...

随机推荐

  1. 蓝桥杯 ALGO-156 表达式计算 JAVA代码 栈的应用

     算法训练 表达式计算   时间限制:1.0s   内存限制:256.0MB      问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个 ...

  2. 线性查找与二分查找(python)

    # -*- coding: utf-8 -*- number_list = [0, 1, 2, 3, 4, 5, 6, 7] def linear_search(value, iterable): f ...

  3. MaxPlus WStr Python 中的字符串传递给 MaxPlus

    MaxPlus WStr Python 中的字符串传递给 MaxPlus 在 MaxPlus 中,很多方法的参数使用的字符串的类是 WStr,所以在 Python 中,我们传递字符串的时候,就要把 P ...

  4. P1280 尼克的任务[区间覆盖dp]

    题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...

  5. JS控制SVG缩放+鼠标控制事件

    话不多说,直接上代码吧,不行你砍我... <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  6. nextjs —— jsx style 学习记录

    作用域 全局 <style global jsx>{` .hero { width: 100%; color: #333; } .title { margin: 0; width: 100 ...

  7. python----装饰器(几种常见方式的使用与理解)

    更详细的装饰器,真心实力推荐,里面介绍的很清楚,介绍可见链接:https://blog.csdn.net/buster_zr/article/details/81104551 1.装饰器的理论: (1 ...

  8. Promise.then方法的执行顺序例题分析

    1. 当Promise对象作为resolve的参数时 const p = Promise.resolve(); const p1 = Promise.resolve(p); //就是p const p ...

  9. 对url路径中的参数进行加密--Java

    需求: 后台对一些比较敏感的参数进行数据加密,然后在传送到前端.当前端跳转到后台时,再由后台对其进行解密. 参考 针对url参数的加密解密算法(java版) 修改:对中间的js页面加密代码改写为jav ...

  10. bzoj 2430: [Poi2003]Chocolate 贪心

    发现每一次切割都会使另一方向所有切割次数++. 而每一刀的代价就是 cost*切割次数,故贪心按照cost从大到小排序即可. #include <bits/stdc++.h> #defin ...