1/13+2

news2025/1/15 22:32:52

运算符重载

myString.h
#ifndef MYSTRING_H
#define MYSTRING_H
#include <cstring>
#include <iostream>
using namespace std;
class myString
{
    private:
        char *str;          //记录c风格的字符串
        int size;            //记录字符串的实际长度
        int capacity;           //记录字符串的容量
    public:
        //无参构造
        myString():size(10), capacity(10)
        {
            str = new char[size];         //构造出一个长度为10的字符串
        }
        //有参构造
        myString(const char *s);              //有参构造     string  s("hello wirld");
        //有参构造
        myString(int n, char ch);                //string   s(5, 'A');
        //析构函数
        ~myString();
        void show();
        //拷贝构造函数
        myString(const myString &other);
        //拷贝赋值函数
        myString& operator=(const myString &other);
        //判空函数
        bool empty() const;
        //size函数
        int getSize() const;
        //c_str函数
        const char* c_str() const;
        //at函数
        char &at(int index);
        //二倍扩容
        void resize(int newCapacity);
        //实现+=运算符重载
        myString& operator+=(const myString &other);
        //取地址运算符重载
        myString* operator&();

        //将[]运算符重载
        char& operator[](const int index);
        //
        //将+重载
        myString& operator+(const myString &other);
        //将==重载
        bool operator==(const myString &other) const;
        //将!=重载
        bool operator!=(const myString &other) const;
        //将>重载
        bool operator>(const myString &other) const;
        //将<重载
        bool operator<(const myString &other) const;
        //将>=重载
        bool operator>=(const myString &other) const;
        //将<=重载
        bool operator<=(const myString &other) const;

        // 友元函数,重载<<运算符
        friend ostream& operator<<(ostream &os, const myString &s)
        {
            os << s.str;
            return os;
        }
        // 友元函数,重载>>运算符
        friend istream& operator>>(istream &is, const myString &s)
        {
            is>> s.str;
            return is;
        }
};
#endif // MYSTRING_H

myString.cpp

#include"myString.h"
//有参构造
myString::myString(const char *s)
{
    if(s)
    {
        size=strlen(s);
        capacity=size+1;
        str=new char[size];
        strcpy(str, s);
    }else {
        size = 0;
        capacity = 10;
        str = new char[size];
    }
}
//有参构造
myString::myString(int n, char ch): size(n), capacity(n + 1)
{
    str = new char[size];
    memset(str, ch, n);
}
//析构函数
myString::~myString()
{
    delete[]str;
}

void myString::show()
{
    cout<<"字符串为:"<<this->str<<endl;
}
//拷贝构造函数
myString::myString(const myString &other): size(other.size), capacity(other.capacity)
{
    str = new char[size];
    strcpy(str, other.str);
}
//拷贝赋值函数
myString &myString::operator=(const myString &other)
{
    if (this != &other)
    {
        delete[] str;
        size = other.size;
        capacity = other.capacity;
        str = new char[size];
        strcpy(str, other.str);
    }
    return *this;
}
//判空函数
bool myString::empty() const
{
    return size == 0;
}
//size函数
int myString::getSize() const
{
    return size;
}
// c_str函数
const char *myString::c_str() const
{
    return str;
}
// at函数
char &myString::at(int index)
{
    if (empty()||index < 0 || index >= size)
    {
        cout<<"访问元素失败"<<endl;
    }
    return str[index];
}
//二倍扩容
void myString::resize(int newCapacity)
{
    char *newStr = new char[newCapacity];
    strcpy(newStr, str);
    delete[] str;
    str = newStr;
    capacity = newCapacity;
}
//实现+=运算符重载
myString &myString::operator+=(const myString &other)
{
    int newSize = size + other.size;
    if (newSize >= capacity) {
        resize(newSize * 2);
    }
    strcat(str, other.str);
    size = newSize;
    return *this;
}
//取地址运算符重载
myString *myString::operator&()
{
    return this;
}
//将[]运算符重载
char &myString::operator[](const int index)
{
    if(index<0||index>=size)
    {
        cout<<"重载失败"<<endl;
    }
    return str[index];
}
//将+重载
myString &myString::operator+(const myString &other)
{
    int newSize=size+other.size;
    if (newSize >= capacity) {
        resize(newSize * 2);
    }
    strcpy(this->str,str);
    strcat(this->str,other.str);
    return *this;
}

//将==重载
bool myString::operator==(const myString &other) const
{
    return strcmp(str,other.str)==0;
}
//将!=重载
bool myString::operator!=(const myString &other) const
{
     return strcmp(str,other.str)!=0;
}
//将>重载
bool myString::operator>(const myString &other) const
{
    return strcmp(str,other.str)>0;
}
//将<重载
bool myString::operator<(const myString &other) const
{
    return strcmp(str,other.str)<0;
}
//将>=重载
bool myString::operator>=(const myString &other) const
{
    return strcmp(str,other.str)>=0;
}
//将<=重载
bool myString::operator<=(const myString &other) const
{
    return strcmp(str,other.str)<=0;
}

main.cpp

#include"myString.h"

int main()
{
    myString s1("Hello");
    myString s2(" World");
    s1 += s2;
    s1.show();       // 输出 "Hello World"
    cout << "size: " << s1.getSize() << endl;  // 输出 "Size: 11"

    cout<<s1[0]<<endl;
    myString s3=s1+s2;
    s3.show();
    myString s4("aaaaa");
    myString s5("bbbbb");
    if(s4==s5)
    {
        cout<<"yes"<<endl;
    }else{
        cout<<"no"<<endl;
    }
    if(s4!=s5)
    {
        cout<<"yes"<<endl;
    }else{
        cout<<"no"<<endl;
    }
    if(s4>s5)
    {
        cout<<"yes"<<endl;
    }else{
        cout<<"no"<<endl;
    }
    if(s4<s5)
    {
        cout<<"yes"<<endl;
    }else{
        cout<<"no"<<endl;
    }
    if(s4>=s5)
    {
        cout<<"yes"<<endl;
    }else{
        cout<<"no"<<endl;
    }
    if(s4<=s5)
    {
        cout<<"yes"<<endl;
    }else{
        cout<<"no"<<endl;
    }
    myString s6;
    cin>>s6;
    s6.show();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2277206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GD32F470Z外部晶振不起振

亲测&#xff0c;主要的原因是因为系统配置里面选择的晶振&#xff0c;选择内部还是外部的无源晶振。 1.无源晶振 打开startup_gd32f450_470.s这个起始文件。 ​​​​​​​ ​​​​​​​ 找到SystemInit。 跳进去这个函数。 在这个函数里面最底下找到sys…

用css和html制作太极图

目录 css相关参数介绍 边距 边框 伪元素选择器 太极图案例实现、 代码 效果 css相关参数介绍 边距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …

【2025 Rust学习 --- 17 文本和格式化 】

字符串与文本 Rust 的主要文本类型 String、str 和 char 内容概括&#xff1a; Unicode 背景知识&#xff1f;单个 Unicode 码点的 char&#xff1f;String 类型和 str 类型都是表示拥有和借用的 Unicode 字符序列。Rust 的字符串格式化工具&#xff0c;比如 println! 宏和 …

C#中颜色的秘密

颜色的秘密: 颜色Color是一个调色板, 所有颜色都是由透明度Alpha,红Red,绿Green,蓝Blue按不同比例调色混合而成,如果不考虑透明度Alpha,颜色共有256*256*25616777216种 ColorARGB A,R,G,B都为byte型[8位],因此可以用整体的32个整数[Int32]来表示一种颜色 Color 所属命名空…

Pycharm 使用教程

一、基本配置 1. 切换Python解释器 pycharm切换解释器版本 2. pycharm虚拟环境配置 虚拟环境的目的&#xff1a;创建适用于该项目的环境&#xff0c;与系统环境隔离&#xff0c;防止污染系统环境&#xff08;包括需要的库&#xff09;虚拟环境配置存放在项目根目录下的 ven…

phpenc加密程序源码

免费扩展加密程序&#xff0c;类似于sg11加密&#xff0c;支持单个PHP&#xff08;免费&#xff09;文件以及批量PHP文件&#xff08;ZIP压缩包格式&#xff09;源码加密的保护平台&#xff0c;加密后的源码文件保持原有代码结构&#xff0c;可以跨平台运行&#xff0c;可以运行…

视频转码对画质有影响吗?视频融合平台EasyCVR支持哪些转码格式?

视频转码过程是将视频文件从一种编码格式转换为另一种格式的过程&#xff0c;这一过程在现代数字媒体中扮演着至关重要的角色。众所周知&#xff0c;视频转码不仅仅是简单的格式转换&#xff0c;它涉及多个关键参数的改变&#xff0c;例如视频编码格式、比特率、分辨率以及帧率…

LeetCode热题100(哈希篇)

题目出自Leetcode热题100&#xff1a;Leetcode热题100 文章目录 1. 两数之和思路代码CJavaPython 49. 字母异位词分组思路代码CJavaPython 128. 最长连续序列思路代码CJavaPython 总结 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找…

python学opencv|读取图像(三十一)缩放图像的三种方法

【1】引言 前序学习进程中&#xff0c;我们至少掌握了两种方法&#xff0c;可以实现对图像实现缩放。 第一种方法是调用cv2.resize()函数实现&#xff0c;相关学习链接为&#xff1a; python学opencv|读取图像&#xff08;三&#xff09;放大和缩小图像_python opencv 读取图…

rk3568 , buildroot , qt ,使用sqlite, 动态库, 静态库

问题说明&#xff1a; 客户反馈 &#xff0c;buildroot 系统 &#xff0c;使用qt 使用sqlite &#xff0c;有报错&#xff0c;无法使用sqlite. 测试情况说明&#xff1a; 我自己测试&#xff0c;发现&#xff0c; buildroot 自己默认就是 使能了 sqlite 的。 是否解决说明&…

Windows图形界面(GUI)-QT-C/C++ - Qt图形绘制详解

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 Qt绘图基础 QPainter概述 基本工作流程 绘图事件系统 paintEvent事件 重绘机制 文字绘制技术 基本文字绘制 ​编辑 高级文字效果 基本图形绘制 线条绘制 ​编辑 形状绘制 …

OpenArk64:Windows 系统分析与逆向工程工具详解

引言 在 Windows 系统的底层操作和逆向工程领域&#xff0c;OpenArk 是一款备受推崇的开源工具集。而 OpenArk64.exe 是 OpenArk 工具的 64 位版本&#xff0c;专门用于 64 位 Windows 系统。它提供了强大的功能&#xff0c;帮助用户深入分析系统内核、进程、文件、注册表等&a…

浅谈计算机网络02 | SDN控制平面

计算机网络控制平面 一、现代计算机网络控制平面概述1.1 与数据平面、管理平面的关系1.2 控制平面的发展历程 二、控制平面的关键技术剖析2.1 网络层协议2.1.1 OSPF协议2.1.2 BGP协议 2.2 SDN控制平面技术2.2.1 SDN架构与原理2.2.2 OpenFlow协议2.2.3 SDN控制器 一、现代计算机…

【C++】PP5015 [NOIP2018 普及组] 标题统计

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示数据规模与约定 &#x1f4af;方法分析方法1&#xff1a;我的做法实…

从玩具到工业控制--51单片机的跨界传奇【2】

咱们在上一篇博客里面讲解了什么是单片机《单片机入门》&#xff0c;让大家对单片机有了初步的了解。我们今天继续讲解一些有关单片机的知识&#xff0c;顺便也讲解一下我们单片机用到的C语言知识。如果你对C语言还不太了解的话&#xff0c;可以看看博主的C语言专栏哟&#xff…

线程池面试题目集合

最近面试中总是问到ThreadPoolExecutor类相关问题&#xff0c;在此集中整理下。 问题1.ThreadPoolExecutor的关键参数是哪些&#xff0c;任务添加过程中&#xff0c;内部线程是怎样构建的&#xff1f; a)任务到达时&#xff0c;线程池数目小于核心线程数corePoolSize&#xff0…

程序员独立开发竞品分析:确定网站使用什么建站系统

要确定一个网站使用的建站系统&#xff0c;可以通过以下几种方法尝试分析&#xff1a; 查看页面源代码&#xff1a; 打开网站&#xff0c;右键点击页面并选择“查看页面源代码”。在代码中查找一些常见的建站系统标志&#xff0c;例如&#xff1a; WordPress 的迹象&#xff1a…

基于Media+Unity的手部位姿三维位姿估计

使用mediapipe Unity 手部位姿三维位姿估计 参考文章 基于Mediapipe的姿势识别并同步到Unity人体模型中 MediapipeUnity3d实现虚拟手_unity mediapipe-CSDN博客 需求 我的需求就是快速、准确的跟踪手部位姿并实现一个三维显示。 主要思路 搭建mdeiapipe系统&#xff0c…

构建高性能网络服务:从 Socket 原理到 Netty 应用实践

1. 引言 在 Java 网络编程中&#xff0c;Socket 是实现网络通信的基础&#xff08;可以查看我的上一篇博客&#xff09;。它封装了 TCP/IP 协议栈&#xff0c;提供了底层通信的核心能力。而 Netty 是在 Socket 和 NIO 的基础上&#xff0c;进一步封装的高性能、异步事件驱动的…

Python入门10:高阶函数

一、什么是高阶函数 1.1、高阶函数的概念和作用&#xff1a; 高阶函数是指 接受函数作为参数 或者 返回函数 作为结果的函数。它在函数式编程中是一个重要概念&#xff08;函数式编程&#xff08;Functional Programming &#xff0c; FP &#xff09;是一 种编程范式&#xf…