c++实现string类

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<conio.h>
#include<cstring>

using namespace std;

class String {
public:
    String(const char *str = NULL);
    String(const String &str);
    ~String();
    size_t size()const { return this->len; }
    String& operator=(const String &str);
    String& operator+=(const String &str);
    String& operator+(const String &str)const;
    char operator[](int index) const;
    char& operator[](int index);
    friend ostream &operator<<(ostream &os, String &str);
    friend istream &operator>>(istream &is, String &str);
    //friend bool operator==(const String &str1, const String &str2);
    bool operator==(const String &str1);
private:
    char *data;
    size_t len;
 };


String::String(const char *str) {
    if (!str) {
        len = 0;
        data = new char[1];
        *data = '\0';
    }
    else {
        len = strlen(str);
        data = new char[len + 1];
        strcpy_s(data, len+1, str);
    }
}

String::String(const String &str) {
    len = str.len;
    data = new char[len + 1];
    strcpy_s(data, len+1, str.data);
}

String::~String() {
    delete[] data;
    len = 0;
}

String& String::operator=(const String &str) {
    if (&str != this) {
        delete[] data;
        len = str.len;
        data = new char[len + 1];
        strcpy_s(data, len + 1, str.data);
    }
    return *this;
}

String& String::operator+=(const String &str) {
    size_t newLength = len + str.len;
    char *tempData = new char[newLength + 1];
    strcpy(tempData, data);
    strcat(tempData, str.data);              //或者strcpy(tempData+len,str.data)
    delete[]data;
    strcpy(data, tempData);
    len = newLength;
    return *this;
}

//有错
String& String::operator+(const String &str)const {
    String newString;
    delete[]newString.data;
    newString.len = len + str.len;
    newString.data = new char[newString.len + 1];
    strcpy(newString.data, data);
    strcat(newString.data, str.data);
    return newString;
}

char String::operator[](int index)const {
    if (index < 0 && index >= len) {
        cerr << "invalid index" << endl;
        exit(1);
    }
    else
        return data[index];
}

char& String::operator[](int index) {
    if (index < 0 && index >= len) {
        cerr << "invalid index" << endl;
        exit(1);
    }
    else
        return data[index];
}

ostream &operator<<(ostream &os, String &str) {
    os << str.data;
    return os;
}
istream &operator >> (istream &is, String &str) {
    char temp[30];
    is >> temp;
    str = temp;
    return is;
}

bool String::operator==(const String &str1) {
    bool ret = this->len == str1.len ? true : false;
    if (!ret)
        return false;
    return strcmp(this->data, str1.data) ? false : true;
}
int main() {
    String str1 = "qwer";
    String str2("asdf");
    String str3(str2);
    String str4, str6, str5("ok");
    //[]运算符重载的两种情况
    {
        char c = str2[1];
        c = 'x';
        cout << str2 << endl;
        str2[1] = 'x';
        cout << str2 << endl;
    }
    //+运算符重载出错,尚未成功
    str4 = str1 + str2;
    str5 += str3;
    cout << str5 << endl;
    cin >> str6;
    cout << str6 << endl;
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值