day44:C++ day4,拷贝赋值、友元、常成员、运算符重载

news2024/11/20 10:30:11

一、仿照string类,完成myString 类

mystring.h

#ifndef MYSTRING_H
#define MYSTRING_H

#include <iostream>
#include <cstring>

using namespace std;

class myString
{
private:
    char *str;          //记录c风格的字符串
    int size;            //记录字符串的实际长度
public:
    //无参构造
    myString():size(10)
    {
        str = new char[size];         //构造出一个长度为10的字符串
        strcpy(str,"");         //赋值为空串
        cout<<"无参构造"<<endl;
    }
    //有参构造
    myString(const char *s)          //string  s("hello world")
    {
        size = strlen(s);
        str = new char[size+1];
        strcpy(str, s);
        cout<<"有参构造"<<endl;
    }

    //拷贝构造
    myString(const myString &other)
    {
        str=new char[other.size];
        strcpy(str,other.str);
        this->size=other.size;
        cout<<"拷贝构造"<<endl;
    }

    //析构函数
    ~myString()
    {
        delete str;
        cout<<"析构函数"<<endl;
    }
    //拷贝赋值函数
    myString operator=(const myString &other);
    //判空函数
    bool string_empty()const;
    //size函数
    int string_size()const;
    //c_str函数
    const char* c_str()const;
    //at函数
    char &at(int pos);
    //加号运算符重载
    myString operator+(const myString &other)const;
    //加等于运算符重载
    myString operator+=(const myString &other);
    //关系运算符重载(>)
    bool operator>(const myString &other)const;
    //中括号运算符重载
    char operator[](int index)const;
};

#endif // MYSTRING_H

mystring.cpp:

#include "mystring.h"

//拷贝赋值函数
myString myString::operator=(const myString &other)
{
    if(this!=&other)
    {
        if(str!=NULL)
        {
            delete str;
        }
        str=new char[other.size];
        strcpy(str,other.str);
        this->size=other.size;
    }
    return *this;
}
//判空函数
bool myString::string_empty()const
{
    return strcmp(str,"")==0;
}
//size函数
int myString::string_size()const
{
    return size;
}
//c_str函数
const char* myString::c_str()const
{
    return str;
}
//at函数
char &myString::at(int pos)
{
    while(1)
    {
        if(pos<0||pos>=size)
        {
            cout<<"输入格式不对,范围为0~"<<size<<endl;
        }else{
            break;
        }
    }
    return *(str+pos);
}
//加号运算符重载
myString myString::operator+(const myString &other)const
{
    myString a=*this;
    char buf[a.size];
    strcpy(buf,a.str);
    if(a.str!=NULL)
    {
        delete a.str;
    }
    a.size=a.size+other.size;
    a.str=new char[a.size];
    strcpy(a.str,buf);
    strcat(a.str,other.str);

    return a;
}
//加等于运算符重载
myString myString::operator+=(const myString &other)
{
    char buf[size];
    strcpy(buf,str);
    if(str!=NULL)
    {
        delete str;
    }
    size=size+other.size;
    str=new char[size];
    strcpy(str,buf);
    strcat(str,other.str);

    return *this;
}
//关系运算符重载(>)
bool myString::operator>(const myString &other)const
{
    return strcmp(str,other.str)>0;
}
//中括号运算符重载
char myString::operator[](int index)const
{
    while(1)
    {
        if(index<0||index>=size)
        {
            cout<<"输入格式不对,范围为0~"<<size<<endl;
        }else{
            break;
        }
    }
    return *(str+index);
}

main.cpp:

#include "mystring.h"

int main()
{
    myString a("hello world");
    cout<<"字符串a为 "<<a.c_str()<<endl;
    cout<<"字符串大小为"<<a.string_size()<<endl;
    a.at(0)='H';
    cout<<"字符串a为 "<<a.c_str()<<endl;
    myString b;
    cout<<"字符串b为空?"<<b.string_empty()<<endl;
    b=a;
    cout<<"字符串b为 "<<b.c_str()<<endl;
    myString c=a+b;
    cout<<"字符串c为 "<<c.c_str()<<endl;
    myString d("hahaha");
    d+=a;
    cout<<"字符串d为 "<<d.c_str()<<endl;
    cout<<"字符串d比a大? "<<d.operator>(a)<<endl;
    return 0;
}

运行结果:

二、思维导图:day3补充: 有道云笔记 day4:有道云笔记

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

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

相关文章

计算一串输出数字的累加和

计算一个文件内数字的累加和 awk {sum$1}END{print sum} 直接抽取数据以后的打印是这样的 cat step-iostat.1125.log |grep sda |cut -c "49-56" |awk {sum$1}END{print sum}

使用Arthas诊断线上问题的常见命令(热更新,监听耗时,方法出入参,jvm信息)

Arthas 启动&#xff08;windows&#xff09; jar包丢到项目任意目录&#xff0c;启动jar&#xff0c;选择java进程&#xff0c;项目上一般选择tomcat对应的pid java -jar arthas-boot.jar * [1]: 35542[2]: 71560 math-game.jar监听方法入参及返回 参数 返回对象 调用深度…

DC/DC开关电源学习笔记(五)开关电源的主要技术指标

(五)开关电源的主要技术指标 1.输入参数2.输出参数3.效率4.电压调整率和负载调整率5.动态特性:负载突变时输出电压的变化6.电源启动时间(Set-Up Time)与保持时间(Hold-Up Time)1.输入参数 输入电压大小,交流还是直流,相数,频率等。 2.输出参数 输出功率,输出电压,输出…

java自定义注解(Annotation)

概念 注解 (Annotation)是以“注解名称”的形式存在于代码中的&#xff0c;相信用过spring的小伙伴们都会使用大量的注解。注解是JDK1.5之后引入的&#xff0c;它可以写在类、方法、属性上面&#xff0c;用于说明或标记某些含义&#xff0c;这些说明或标记可用于生成文档、程序…

golang面试题:reflect(反射包)如何获取字段tag​?为什么json包不能导出私有变量的tag?

问题 json包里使用的时候&#xff0c;会结构体里的字段边上加tag&#xff0c;有没有什么办法可以获取到这个tag的内容呢&#xff1f; 举例 tag信息可以通过反射&#xff08;reflect包&#xff09;内的方法获取&#xff0c;通过一个例子加深理解。 package mainimport (&quo…

DevSecOps 中的漏洞管理(下)

建立漏洞管理程序以支持DevSecOps 在讨论DevSecOps及DevOps模型中包含安全性的重要性时&#xff0c;建立有效的漏洞管理实践是非常重要的。这可以通过将漏洞管理设置为程序来实现。 我们可以开始对IT组织进行漏洞管理评估。人们经常问的问题可能是&#xff0c;既然已经建立了…

第一章 计算机系统概述 四、操作系统的运行机制

注:很多人习惯把Linux、Windows、MacOS的“小黑框”中使用的命令也称为“指令”&#xff0c;其实这是“交互式命令接口”&#xff0c;注意与本节的“指令”区别开。本节中的“指令”指二进制机器指令。 一、CPU的两种状态 状态的切换&#xff1a; 内核态转用户态&#xff0c;是…

【个人博客系统 × Redis】“最后的升级“ · 连接Redis · Redis的基本使用

【JavaEE】进阶 个人博客系统&#xff08;7&#xff09; 文章目录 【JavaEE】进阶 个人博客系统&#xff08;7&#xff09;1. linux安装Redis1.1 通过yum商店下载Redis1.2 启动Redis1.3 操作Redis 2. Redis的基本使用&#xff08;关键字大小写不区分&#xff09;2.1 set2.2 g…

SUMPRODUCT函数

SUMPRODUCT函数返回相应范围或数组的个数之和。 默认操作是乘法&#xff0c;但也可以执行加减除运算。 本示例使用 SUMPRODUCT 返回给定项和大小的总销售额&#xff1a; SUMPRODUCT 匹配项 Y/大小 M 的所有实例并求和&#xff0c;因此对于此示例&#xff0c;21 加 41 等于 62。…

UML-用例图

目录 一、UML 什么是UML&#xff1f; 为什么要用UML&#xff1f; UML图有哪些&#xff1f; 二、用例图 用例图摘要 用例图主要元素 1. 参与者&#xff08;Actor&#xff09; 2. 用例(Use Case) 3. 关系 4. 边界 用例图之间的关系 &#xff08;1&#xff09;参与者…

Figma实用插件速收藏!精选19个干货插件大公开!

Figma 如今有着大量的插件&#xff0c;在 UI/UX 设计领域&#xff0c;很多工作已经不用真的从零开始做了。用好 Figma 插件&#xff0c;往往能让设计工作事半功倍。不过其中的插件素质差别很大&#xff0c;需要仔细筛选。不过如果你选择了对的插件&#xff0c;合理的设置&#…

SpringCloud(17~21章):Alibaba入门简介、Nacos服务注册和配置中心、Sentinel实现熔断与限流、Seata处理分布式事务

17 SpringCloud Alibaba入门简介 17.1 why会出现SpringCloud alibaba Spring Cloud Netflix项目进入维护模式 https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now 说明 Spring Cloud Netflix Projects Entering Maintenance Mode 什么是维护模…

c高级day4(shell)

实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数写一个函数&#xff0c;输出当前用户的uid和gid&#xff0c;并使用变量接收结果

20230911 Shell指令数组以及函数值传递,值返回

实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 #!/bin/bashfunction fun() {sum0for ((i0;i<$var;i))do(( sumarr[i] ))doneecho $sum } read -p "输入该数组个数: " var for((j0;j<$var;j)) doread -p "输入数组第$j个值: " arr[j] …

Jmeter引入外部jar包以满足加密数据的Post请求

目录 一、把项目打成jar包 1、创建一个Maven项目&#xff0c;并保证可以正常运行。 2、把工具类放置项目中&#xff0c;确保无报错且能够正常使用。 3、打包 4、验证 jar包是否有效 5、你想打多个工具类的包 二、在jmeter中使用 1、把jar包放到jmeter仓库下&#xff0c;…

Mixin从理论到实践

mixin从理论到实践 mixin从理论到实践一、什么是mixin二、使用mixin三、mixin的合并策略四、mixin辨析五、个人实践 mixin从理论到实践 一、什么是mixin mixin混入 — Vue.js (vuejs.org) 官方解释&#xff1a; 混入 (mixin) 提供了一种非常灵活的方式&#xff0c;来分发 Vue …

uni-app:自带的消息提示被遮挡的解决办法(自定义消息提示框)

效果&#xff1a; 代码&#xff1a; 1、在最外层或者根组件的模板中添加一个容器元素&#xff0c;用于显示提示消息。例如&#xff1a; <div class"toast-container" v-if"toastMessage"><div class"toast-content">{{ toastMessa…

shell脚本中分支结构、循环、以及函数的介绍和使用

练习 实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 #!/bin/bash function sum() {sum0for i in ${arr[*]}do((sumi))doneecho "数组和为&#xff1a;"$sum } read -p "请输入一个数组&#xff1a;" -a arr sum arr写一个函数&#xff0c…

华为云云服务器云耀L实例评测 | 从零开始:华为云云服务器L实例使用教程

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Mediasoup源码介绍

一、Mediasoup 整体结构 整个Mediasoup库通过Nodejs管理&#xff0c;比如整体逻辑、worker、router、producer、consumer...都是通过JS进行管理的。 其底层的数据传输是通过C部分进行控制的&#xff0c;通过NodeJs来控制C部分&#xff0c;以实现整体的数据传输效 二、Mediasou…