C++之运算符重载自定义String类

简介: C++之运算符重载自定义String类

我这里使用的是vs2013 希望可以帮助到大家

第一个文件

MyString.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class MyString{
    friend ostream&operator<<(ostream& cout, MyString &str);
    friend istream&operator>>(istream& cin, MyString &str);
public:
    MyString(const char * str);
    MyString(const MyString &str);
    ~MyString();
    //重载=运算符
    MyString& operator=(const char * str);
    MyString& operator=(const MyString & str);
    //重载[]运算符
    char& operator[](int index);
    //重载+运算符
    MyString operator+(const MyString & str);
    MyString operator+(const char * str);
    //重载双等号运算符
    bool operator==(const char *str);
    bool operator==(const MyString &str);
private:
    char *pString;//执行堆区的指针
    int m_Size;//字符串
};

然后就是实现的MyString.cpp文件

#include "MyString.h"
ostream&operator<<(ostream& cout, MyString &str){
    cout << str.pString;
    return cout;
}
//右移运算符的重载
istream&operator>>(istream& cin, MyString &str){
    if (str.pString != NULL){
        delete[] str.pString;
        str.pString = NULL;
    }
    char buf[1024];
    cin >> buf;
    str.pString = new char[strlen(buf)+1];
    strcpy(str.pString, buf);
    str.m_Size = strlen(buf);
    return cin;
}
MyString::MyString(const char * str){
    //cout << "有参构造函数调用" << endl;
    this->pString = new char[strlen(str) + 1];
    strcpy(this->pString, str);
    this->m_Size = strlen(str);
}
MyString::MyString(const MyString &str){
    this->pString = new char[strlen(str.pString) + 1];
    strcpy(this->pString, str.pString);
    this->m_Size = str.m_Size;
}
MyString::~MyString(){
    //cout << "析构函数调用" << endl;
    if (this->pString != NULL){
        delete[] this->pString;
        this->pString = NULL;
    }
}
MyString& MyString::operator=(const char * str){
    if (this->pString != NULL){
        delete[] this->pString;
        this->pString = NULL;
    }
    this->pString = new char[strlen(str) + 1];
    strcpy(this->pString, str);
    return *this;
}
MyString& MyString::operator=(const MyString & str){
    if (this->pString != NULL){
        delete[] this->pString;
        this->pString = NULL;
    }
    this->pString = new char[strlen(str.pString) + 1];
    strcpy(this->pString, str.pString);
    return *this;
}
char& MyString::operator[](int index){
    return this->pString[index];
}
MyString MyString::operator+(const MyString & str){
    int newSize = this->m_Size + strlen(str.pString) + 1;
    char *tmp = new char[newSize];
    memset(tmp, 0, newSize);
    strcat(tmp, this->pString);
    strcat(tmp, str.pString);
    MyString newStr(tmp);
    delete[] tmp;
    return newStr;
}
MyString MyString::operator+(const char* str){
    int newSize = this->m_Size + strlen(str) + 1;
    char *tmp = new char[newSize];
    memset(tmp, 0, newSize);
    strcat(tmp, this->pString);
    strcat(tmp,str);
    MyString newStr(tmp);
    delete[] tmp;
    return newStr;
}
//重载双等号运算符
bool MyString::operator==(const char *str){
    if (strcmp(this->pString, str) == 0 && this->m_Size == strlen(str)){
        return true;
    }
    return false;
}
bool MyString::operator==(const MyString & str){
    if (strcmp(this->pString, str.pString) == 0 && this->m_Size == strlen(str.pString)){
        return true;
    }
    return false;
}

主函数文件

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include"MyString.h"
using namespace std;
//测试MyString
void test01(){
    MyString str = "abc";
    //cout << str << endl;
    //cin >> str;
    //cout << str << endl;;
    MyString str2(str);
    MyString str3 = "";
    //str3 = str2;
    str3 = "123123";
    cout << str3;
    str3[0] = 'p';
    cout << "str3 的第一个位置=" << str3[0] << endl;
    MyString str4 = "";
    str4 = str2 + str3;
    cout << str4 << endl;
    if ( str2== str4){
        cout << "str2==str4" << endl;
    }
    else {
        cout << "str2!=str4" << endl;
    }
}
int main(){
    test01();
    system("pause");
    return EXIT_SUCCESS;
}
目录
打赏
0
0
0
0
3
分享
相关文章
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
模拟实现c++中的string
模拟实现c++中的string
|
1月前
|
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
70 19
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
53 13
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
96 2
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
111 2