自己实现的string类

自己实现的一个string类,包括基本构造,复制构造,赋值和析构函数,比较函数,输入输出函数,锻炼一下动手能力。

#include <iostream>
#include <cstring>
#include <iomanip>

using namespace std;

class MyString{
public:
    MyString(const char *s=NULL);
    MyString(const MyString& rhs);
    MyString& operator=(const MyString& rhs);
    MyString& operator=(const char* s);
    ~MyString();
    char& operator[](int i);
    int length() const {return len; }
    char *c_str(){return data;}

    friend bool operator<(const MyString &st1, const MyString &st2);
    friend bool operator>(const MyString &st1, const MyString &st2);
    friend bool operator==(const MyString &st1, const MyString &st2);
    friend MyString operator+(const MyString &s1, const MyString &s2);

    friend ostream& operator<<(ostream &os, const MyString &st);
    friend istream& operator>>(istream &is, MyString &st);

private:
    char *data;
    int len;
};

MyString::MyString(const char *s)
{
    if(NULL==s)
    {
        len=0;
        data=new char[1];
        *data='\0';
    }
    else
    {
        len=strlen(s);
        data=new char[len+1];
        strcpy(data,s);
    }
}

MyString::MyString(const MyString &rhs)
{
    len=strlen(rhs.data);
    data=new char[len+1];
    strcpy(data,rhs.data);
}

MyString& MyString::operator=(const MyString &rhs)
{
    if(this==&rhs)
        return *this;
    delete []data;
    len=strlen(rhs.data);
    data=new char[len+1];
    strcpy(data,rhs.data);
    return *this;
}

MyString& MyString::operator=(const char* s)
{
    delete []data;
    len=strlen(s);
    data=new char[len+1];
    strcpy(data,s);
    return *this;
}

MyString::~MyString()
{
    delete []data;
}

char& MyString::operator[](int i)
{
    return data[i];
}

//注意友元函数定义时不要friend,而且不要String::
bool operator<(const MyString &st1, const MyString &st2)
{
    return (strcmp(st1.data,st2.data)<0);
}

bool operator>(const MyString &st1, const MyString &st2)
{
    return (strcmp(st1.data,st2.data)>0);
}

bool operator==(const MyString &st1, const MyString &st2)
{
    return (strcmp(st1.data,st2.data)==0);
}

MyString operator+(const MyString &st1, const MyString &st2)
{
    MyString res;
    res.len=st1.len+st2.len;
    res.data=new char[res.len+1];
    strcpy(res.data,st1.data);
    strcat(res.data,st2.data);
    return res;
}

istream &operator>>(istream &cin, MyString &str)
{
    const int limit_string_size = 4096;

    str.data = new char[limit_string_size];

    cin >> setw(limit_string_size) >> str.data;
    str.len = strlen(str.data);
    return cin;
}

ostream &operator<<(ostream &cout, MyString &str)
{
    cout<<str.c_str();
    return cout;
}

int main()
{
    MyString s1("I am s1.");
    MyString s2="Hello,This is s2.";
    cout<<s1<<endl;
    cout<<s2<<endl;
    MyString s3(s1);
    cout<<s3<<endl;
    s3=s2;
    cout<<s3<<endl;
    s3="My name is: " + s1;
    cout<<s3<<endl;
    s3=s1+s2;
    cout<<s3<<endl;
    return 0;
}
时间: 2024-12-11 00:02:39

自己实现的string类的相关文章

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中

String类实现

String类是应用框架中不可或缺的类 重载运算符实现字符串的操作 #idndef IOTECK_STRING_H_#define IOTECK_STRING_H_namespace iotek{ class String { public: String(const char*=NULL); ~String(); String(const String&); //拷贝构造函数 //String a; a=b; String& operator=(const String &);

String类

一.概述 Sting s1 = "abc";    //s1是一个类类型变量,"abc"是一个对象. String s2 = new String("abc"); //s1 . s2 的区别: 前者在内存中有一个对象,后者在内存中有两个对象. s1.equals(s2) 为true  因为 String复写了equals方法 二.常见的功能-获取和判断 获取: 1.int length(); 获取长度 2.char chatAt(int inde

C++实现String类

这是一道十分经典的面试题,可以短时间内考查学生对C++的掌握是否全面,答案要包括C++类的多数知识,保证编写的String类可以完成赋值.拷贝.定义变量等功能. #include<iostream> using namespace std; class String { public: String(const char *str=NULL); String(const String &other); ~String(void); String &operator =(cons

java中String类的构造函数

String类中的构造函数String(); 构造一个空字符串对象String(byte[] bytes); 通过byte数组构造字符串对象String(byte[] bytes,int offset,int length);通过byte数组,从offset开始,总共length长的字节构造字符串对象String(char[] value); 通过char数组构造字符串对象String(byte[] char,int offset,int length);通过char数组,从offset开始,总

Java (六、String类和StringBuffer)

Java String 类 字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 创建字符串 // ==比较的是字符串在栈中存放的首地址,而equals()比较的是两个字符串的内容是否相同 //普通的声明字符串的方法,只会在字符串常量池里开辟空间,并且开辟空间之前,会检查字符串常量池里是否已存在 //相同的数据,如果有,直接指向已存在的数据,如果没有会在字符串常量池里开辟一个新的空间 String s = "ccy"

JAVA API(一)String类和StringBuffer类

1.String类和StringBuffer类 在程序中经常会用到字符串,所谓的字符串就是指一连串的字符,它是由多个单个字符连接而成的.字符串中可以包含任意字符,这些字符必须包含在一对双引号""之内,如"abc".在Java中定义了String和StringBuffer类来封装字符串,并提供了一系列操作字符串的方法,它们都位于java.lang包中,因此不需要导包就可以直接使用.下面将对String类和StringBuffer类详细讲解. 1.1String类的初始

String类replaceAll方法正则替换深入分析

作者网址: https://my.oschina.net/shipley/blog/98973 背景:      前几天有人发了一个关于下面问题的贴,对这个有点好奇,故花时间做了点研究.        对单个反斜杠字符串替换成双斜杠的Java实现如下:    String s = "\\";    方法一:String sr1 = s.replaceAll("\\\\", "\\\\\\\\");    方法二:String sr1 = s.re

java11-3 String类的获取功能

package cn_String2;/* String类的获取功能 int length():获取字符串的长度. char charAt(int index):获取指定索引位置的字符 int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引. 为什么这里是int类型,而不是char类型? 原因是:'a'和97其实都可以代表'a' int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引. int indexOf(int ch,int

C++的string类

关于头文件cstring,提供了strlen及很多与字符串相关的函数的声明. 头文件string,要使用string类,必须在程序中包含头文件string,string类位于std中,必须提供一条using编译指令,或者使用std::string来引用它. 1.string类的使用: 不能将一个数组赋给另一个数组,但可以将一个string对象赋给另一个string对象. size()是string类的一个方法.可以将C++里边的string类理解成类型,我觉的可以理解成,创建:一个新类型,就像j