C++ 对象的拷贝、赋值、清理和移动(MyString类)

MyString类

MyString.h

#ifndef MYSTRING_H
#define MYSTRING_H

#include <iostream>
using namespace std;

class MyString
{
    private:
        char*  str = nullptr;
        unsigned int MaxSize = 0;
    public:
        MyString();                /*默认构造函数*/
        MyString(unsigned int n);  /*有参构造函数*/
        MyString(const char* S);   /*有参构造函数*/
        MyString(const MyString& S);                  /*拷贝构造函数*/
        MyString& operator= (const MyString& S);      /*拷贝赋值运算符重载*/
        ~MyString();  /*析构函数*/
        MyString( MyString && S) noexcept;            /*移动构造函数*/
        MyString& operator= (MyString&& S) noexcept;  /*移动赋值运算符重载*/
        friend ostream& operator<< (ostream& Output, MyString& S);
        friend istream& operator>> (istream& Input, MyString& S);
        char& operator[] (unsigned int i);
  //   const char& operrator[] (unsigned int i)  const ;
};
#endif

MyString.c

#include "MyString.h"

/*获取字符串长度*/
unsigned int Length(const char* S)
{
    const char* p = S;
    unsigned int L = 0;
    while (*p != '\0')
    {
        p++;
        L++;
    }
    return L;
}
/*默认构造函数*/
MyString::MyString()
{
    cout << "无参构造函数:";
}
/*创建可包含n个字符的空字符串*/
MyString::MyString(unsigned int n)
{
    MaxSize = n + 1;
    str = new char[MaxSize] {};
}
/*构造函数,写入字符串*/
MyString::MyString(const char* S)
{
    MaxSize = Length(S) + 1;
    str = new char[MaxSize] {};
    for (unsigned int i = 0; i < (MaxSize - 1); i++)
    {
        str[i] = S[i];
    }
    str[MaxSize - 1] = '\0';
    cout << "有参构造函数:" ;
}
/*拷贝构造函数*/
MyString::MyString(const MyString& S)
{
    MaxSize = S.MaxSize;
    str = new char[MaxSize] {};
    for (unsigned int i = 0; i < MaxSize; i++)
    {
       str[i] = S.str[i];
    }
    cout << "拷贝构造函数:";
}
/*拷贝赋值运算符重载*/
MyString& MyString::operator= (const MyString& S)
{
    delete[] str;
    MaxSize = S.MaxSize;
    str = new char[MaxSize] {};
    for (unsigned int i = 0; i < MaxSize; i++)
    {
        str[i] = S.str[i];
    }
    cout << "拷贝赋值运算符重载:";
    return *this;
}
/*析构函数*/
MyString::~MyString()
{
    if (str != nullptr)
        delete[] str;
    cout << "析构函数" << endl;
}
/*移动构造函数*/
MyString::MyString(MyString&& S) noexcept
{
    delete[] str;
    MaxSize = S.MaxSize;
    str =S.str;
    S.str = nullptr;
    cout << "移动构造函数:";
}
/*移动赋值运算符重载*/
MyString& MyString::operator= (MyString&& S) noexcept
{
    delete[] str;
    MaxSize = S.MaxSize;
    str = S.str;
    S.str = nullptr;
    cout << "移动赋值运算符重载:";
    return *this;
}

ostream& operator<< (ostream& Output, MyString& S)
{
    Output << S.str;
    return Output;
}
istream& operator>> (istream& Input, MyString& S)
{
    Input >> S.str;
    return Input;
}

char& MyString::operator [] (unsigned int i) 
{
    return str[i];
}

main.c

#include <iostream>
using namespace std;

#include "MyString.h"

MyString GetMyString(void)
{
    MyString temp = "C++";
    return temp;
}

void MyString_Test(void)
{
    MyString S1;         //无参构造函数
    cout << "S1 " << endl;
    char str[] = { "Hello World!" };
    MyString S2{ str };   //有参构造函数
    cout << "S2 " << S2 << endl;
    MyString S3{ S2 };    //拷贝构造函数
    cout << "S3 " << S3 << endl;
    S1 = S3;             //拷贝赋值运算符重载
    cout << "S1 " << S1 << endl;
    MyString S4{ move(S1) };  //移动构造函数
    // MyString S4{ GetMyString() };    
    cout << "S4 " << S4 << endl;
    S4 = GetMyString();  //移动赋值运算符重载
    cout << "S4 " << S4 << endl;
    MyString S5{ 3 };
    S5[0] = 'A';
    S5[1] = 'B';
    S5[2] = 'C';
    cout << S5 << endl;
}

int main()
{
   MyString_Test();
}

结果:

MyStirng

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot系列-2 自动装配

背景&#xff1a; Spring提供了IOC机制&#xff0c;基于此我们可以通过XML或者注解配置&#xff0c;将三方件注册到IOC中。问题是每个三方件都需要经过手动导入依赖、配置属性、注册IOC&#xff0c;比较繁琐。 基于"约定优于配置"原则的自动装配机制为该问题提供了一…

recycleView(二)Grid,中间有间距,left,right,top,bottom没有间距

1.作用 1.效果图 item的top&#xff0c;bottom&#xff0c;right&#xff0c;left都是0 2.代码 1.关键代码 // 设置RecycleView的item间的间距&#xff0c;上下间距为20排序&#xff0c;左右间距为20排序binding.rv.addItemDecoration(object : RecyclerView.ItemDecorat…

算法——滑动窗口

什么是窗口&#xff1f;就是符合题目要求的区域内的数据&#xff0c;将每次符合数据的窗口内的数据记录下来&#xff0c;然后将窗口后移&#xff0c;寻找其他符合要求的数据&#xff0c;每次进入窗口和退出窗口都需要一定的要求 一、 LCR 008. 长度最小的子数组 - 力扣&#…

数据结构—二叉树的模拟实现(c语言)

目录 一.前言 二.模拟实现链式结构的二叉树 2.1二叉树的底层结构 2.2通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树 2.3二叉树的销毁 2.4二叉树查找值为x的节点 2.5二叉树节点个数 2.6二叉树叶子节点个数 2.7二叉树第k层节点个数 三.二叉树的遍历 3.1…

Keras实现图注意力模型GAT

简介&#xff1a;本文实现了一个GAT图注意力机制的网络层&#xff0c;可以在Keras中像调用Dense网络层、Input网络层一样直接搭积木进行网络组合。 一&#xff0c;基本展示 如下图所示&#xff0c;我们输入邻接矩阵和节点特征矩阵之后&#xff0c;可以直接调用myGraphAttention…

C语言之pthread_once实例总结(八十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

史上最全最新Ubuntu20.04安装教程(图文)

总的来说&#xff0c;安装Ubantu包含以下三个步骤&#xff1a; 一、安装虚拟机 二、Ubuntu镜像下载 三、虚拟机配置 一、安装虚拟机 选择安装VMware Workstation&#xff0c;登录其官网下载安装包&#xff0c;链接如下&#xff1a; 下载 VMware Workstation Pro​www.vmwa…

设计模式之--原型模式(深浅拷贝)

原型模式 缘起 某天&#xff0c;小明的Leader找到小明:“小明啊&#xff0c;如果有个发简历的需求&#xff0c;就是有个简历的模板&#xff0c;然后打印很多份&#xff0c;要去一份一份展示出来&#xff0c;用编程怎么实现呢&#xff1f;” 小明一听&#xff0c;脑袋里就有了…

ARM64 linux并发与同步之内存屏障

1.2 内存屏障 1.2.1 概念理解 原理部分比较苦涩难懂&#xff0c;我们先不过多详细介绍这部分的由来和经过&#xff0c;接下来着重讲解什么用途和实现&#xff1b; ARM64架构中提供了3条内存屏障指令。 数据存储屏障(Data Memory Barrier, DMB)指令。数据同步屏障(Data Synch…

劲松HPV防治诊疗中心发布:HPV感染全面防治解决方案

在当今社会&#xff0c;HPV(人乳头瘤病毒)感染问题已成为广大公众关注的焦点。作为一种高度传染性的病毒&#xff0c;HPV感染不仅可能导致生殖器疣&#xff0c;还可能引发各种癌症。面对这一严重威胁&#xff0c;劲松HPV防治诊疗中心以其专业的医疗团队、正规的治疗流程和全方位…

Python基础入门例程51-NP51 列表的最大与最小(循环语句)

最近的博文&#xff1a; Python基础入门例程50-NP50 程序员节&#xff08;循环语句&#xff09;-CSDN博客 Python基础入门例程49-NP49 字符列表的长度-CSDN博客 Python基础入门例程48-NP48 验证登录名与密码&#xff08;条件语句&#xff09;-CSDN博客 目录 最近的博文&…

函数极限求解方法归纳

1、连续函数直接代入值&#xff08;加减不可以部分代入值&#xff09; 例题1 配凑构造等价无穷小 等价无穷小 注意&#xff1a;不要在加减中部分使用等价无穷小&#xff0c;可以利用拆极限的方式求&#xff0c;拆出来的每一部分都要有极限&#xff0c;如果有一部分没有极限就是…

STM32F4X定时器之通用定时器

一、STM32通用定时器概述 通用定时器包括一个16位或32位自动重载计数器&#xff0c;可通过可编程预分频器进行驱动。定时器可以实现多种功能&#xff0c;包括测量输入信号的脉冲宽度和生成输出波形&#xff0c;通过使用定时器预分频器和RCC时钟控制器预分频器&#xff0c;可以…

目标检测——Yolo系列(YOLOv1/2/v3/4/5/x/6/7/8)

目标检测概述 什么是目标检测&#xff1f; 滑动窗口&#xff08;Sliding Window&#xff09; 滑动窗口的效率问题和改进 滑动窗口的效率问题&#xff1a;计算成本很大 改进思路 1&#xff1a;使用启发式算法替换暴力遍历 例如 R-CNN&#xff0c;Fast R-CNN 中使用 Selectiv…

C++算法:完美矩形

题目 给你一个数组 rectangles &#xff0c;其中 rectangles[i] [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi, yi) &#xff0c;右上顶点是 (ai, bi) 。 如果所有矩形一起精确覆盖了某个矩形区域&#xff0c;则返回 true &#xff1b;否则&#xf…

AI 绘画 | Stable Diffusion WebUI的基本设置和插件扩展

前言 Stable Diffusion WebUI是一个基于Gradio库的浏览器界面&#xff0c;用于配置和生成AI绘画作品&#xff0c;并且进行各种精细地配置。它支持目前主流的开源AI绘画模型&#xff0c;例如NovelAI/Stable Diffusion。 在基本设置方面&#xff0c;Stable Diffusion WebUI的默…

asp.net外卖网站系统VS开发mysql数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net外卖网站系统 是一套完善的web设计管理系统&#xff0c;系统采用mvc模式&#xff08;BLLDALENTITY&#xff09;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为mysql&#xff0c;使用c#语…

Git的原理与使用(一)

目录 Git初始 Git安装 Git基本操作 创建git本地仓库 配置git 工作区,暂存区,版本库 添加文件,提交文件 查看.git文件 修改文件 版本回退 小结 Git初始 git是一个非常强大的版本控制工具.可以快速的将我们的文档和代码等进行版本管理. 下面这个实例看理解下为什么需…

CountDownLatch和CyclicBarrier详解

1. CountDownLatch 1.1 简介 CountDownLatch 是 Java 中并发包&#xff08;java.util.concurrent&#xff09;提供的一种同步工具&#xff0c;用于在多线程环境中协调多个线程之间的执行顺序。它的作用是允许一个或多个线程等待其他线程完成操作。 CountDownLatch 通过一个计…

java使用geotools导出shp文件

SHP格式是一种矢量数据格式&#xff0c;用于存储地理信息系统&#xff08;GIS&#xff09;数据。 SHP文件由一系列有序的文件组成&#xff0c;我们导出的shp文件包括.shp、.shx、.dbf、.prj以及.fix文件。 .shp&#xff08;shape&#xff09;文件&#xff1a;存储矢量地图数据&…