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;
}

原文地址:https://www.cnblogs.com/simp/p/12193278.html

时间: 2024-10-14 03:41:58

C++之运算符重载自定义String类的相关文章

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载、!运算符重载、赋值运算符重载 、String类([]、 +、 += 运算符重载)、&gt;&gt;和&lt;&lt;运算符重载

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载.!运算符重载.赋值运算符重载 .String类([]. +. += 运算符重载).>>和<<运算符重载 一.++/--运算符重载 1.前置++运算符重载 成员函数的方式重载,原型为: 函数类型 & operator++(); 友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &); 2.后置++运算符重载 成员函数的方式重载,原型为:

不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自定义类型转换 示例CppOperator.h #pragma once #include <string> using namespace std; namespace NativeDll { class CppOperator { public: string Demo(); }; } CppOperator.cpp /* * 运算符重载, 自定义类型转换 */ #include &qu

利用运算符重载实现Date类

运算符重载: 重载,就是重新赋予新的含义.运算符重载的方法是定义一个重载运算符的函数,使指定的运算符不仅能实现原有的,而且能实现在函数中指定的新的功能.在使用被重载的运算符时,系统会自动调用该函数,以实现相应的功能.即运算符重载实质是函数的重载. 重载运算符的格式如下: 函数类型 operator 运算符名称(形参表) { 对运算符的重载处理 } c++中绝大多数的运算符容许重载,不能重载的运算符只有5个:即 . (成员访问运算符) * (成员指针访问运算符) :: (域运算符) sizeof

第八周(运算符重载)Time类

/* *copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名称:第八周(运算符重载) *作者:王忠 *完成日期:2015.4.28 *版本号:v1.0 * *问题描述:实现Time类中的运算符重载. *输入描述: *程序输出: #include <iostream> using namespace std; class CTime { private: unsigned short int hour; // 时 unsigned shor

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

13.44 编写标准库string类的简化版本,命名String.你的类应该至少有一个默认构造函数和一个接受C风格字符串指针参数的构造函数.使用allocator为你的String类分配所需内存. 13.47 添加拷贝构造函数和拷贝赋值运算符,并添加打印语句,则每次函数执行时打印一条信息. 13.48 定义一个vector<String>并在其上多次调用push_back.运行程序,观察String被拷贝了多少次. #include<iostream> #include<st

0718-----C++Primer听课笔记----------运算符重载

0.两个要点 a) 一个空类,编译器自动合成默认无参构造函数.析构函数.拷贝构造函数.赋值运算符. b) 在编写类的时候,必须严格区分对象是否可复制. 1.运算符重载之 string类 1.1 运算符重载的几个要点: a) 运算符重载可以有成员函数和友元函数的形式,后者比前者多一个参数. b) =和+=必须重载为成员函数的形式(不太理解原因). c) 输入和输出必须为友元函数的形式.而且输入操作符要考虑输入失败的情况. d) 运算符重载为成员函数的形式,那么该操作符的第一个操作数必然为该类的对象

string 类操作的重载实现及其提供的其他常用成员函数

目录 1,string 类操作的重载实现 2,String类提供的其他常用成员函数 @ 1,string 类操作的重载实现 /* string 类操作的重载实现 */ class CMyString { public: CMyString(char *ptr = NULL) { if (ptr == NULL) { mpStr = new char[1]; *mpStr = '\0'; } else { mpStr = new char[strlen(ptr) + 1]; strcpy(mpSt

第十章 运算符重载

第十章 运算符重载 1.运算符重载的方法 (实质:函数重载) *一般格式: 函数类型名operator 运算符名称(参数表){函数体:} 2.运算符重载的规则 *不允许定义新的运算符 *允许重载的运算符 双目运算符 +(加法)  - (减法)  * (乘法) / (除法)   %(取模) 关系运算符 ==(等于) != (不等)  <   >   <=   >= 逻辑运算符 ||(或)   && (与)  !(非) 单目运算符 + (正)  -(负)   *(指针)

关于c++的运算符重载那些事

搞c++有一段时间了,今天突然要重载一个运算符,发现自己有点忘了,遂查查资料做一下c++运算符重载的小总结. 一.何为运算符重载 运算符的重载是c++语言特有的,java什么的是没有运算符重载的,所以运算符重载在笔试面试中有可能成为c++的高频考点.运算符重载就是重新定义运算符的意义,如常用的+,-,×,÷都是可以重载的.运算符重载使用的是关键字operator,表现形式是: