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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue工程化

目录 一、环境准备 npm 二、Vue整站使用 1、Vue项目创建和启动 区别 目录结构 启动 2、Vue开发流程 App.vue 快速入门 3、API风格 案例 细节注意 代码实现 测试 一、环境准备 介绍&#xff1a;create-vue是Vue官方提供的最新的脚手架工具&#xff0c;用于快速生…

利用自动化和条形码优化SAP制造供应链

背景 Welch Allyn 是全球领先的医疗诊断设备制造商&#xff0c;开发了数百种突破性产品和技术&#xff0c;使一线从业者能够提供卓越的患者护理。它拥有近 2,500 名员工&#xff0c;在 26 个不同的国家/地区工作。 挑战 提高运营效率 原因&#xff1a;用户需要长途跋涉并完成多…

freertos源码下载和目录结构分析

1、源码下载 下载网址&#xff1a;https://www.freertos.org/zh-cn-cmn-s/&#xff1b; 2、源码目录结构 3、关键的代码文件

SOLIDWORKS Simulation助您分析参数变化时的趋势及寻找设计参数的最优值

在分析一个装配体时&#xff0c;载荷、几何体及材料常数都被当做设计变量来处理&#xff0c;而设计情形可以很方便的应用到这种分析中&#xff0c;结果能以设计变量的函数进行图表来显示&#xff0c;同时它可以运行多个算例&#xff0c;从而帮助我们获得能够用于优化设计的趋势…

第十五届全国大学生数学竞赛初赛试卷解析

参加了此次比赛&#xff0c;收获很多&#xff0c;两个半小时让我体会到了很多&#xff0c;所以想做个总结 第十五届全国大学生数学竞赛初赛试题 &#xff08;非数学A类,2023年&#xff09; 下面是答案解析&#xff0c;有兴趣的小伙伴可以做完对照一下。 直接使用洛必…

什么是原生IP与广播IP?如何区分?为什么需要用原生IP?

在代理IP中&#xff0c;我们常常听到原生IP与广播IP&#xff0c;二者有何区别&#xff1f;如何区分呢&#xff1f;下面为大家详细讲解。 一、什么是原生IP 原生IP地址是互联网服务提供商&#xff08;ISP&#xff09;直接分配给用户的真实IP地址&#xff0c;无需代理或转发。此…

PyCharm 【unsupported Python 3.1】

PyCharm2020.1版本&#xff0c;当添加虚拟环境发生异常&#xff1a; 原因&#xff1a;Pycharm版本低了&#xff01;不支持配置的虚拟环境版本 解决&#xff1a;下载PyCharm2021.1版本&#xff0c;进行配置成功&#xff01;

nvm下载安装以及配置

1. nvm下载 nvm各版本下载链接&#xff1a;Releases coreybutler/nvm-windows GitHub 建议下载安装版的&#xff0c;非安装版还需要额外配置环境变量。 2. nvm安装 注意&#xff1a;在安装 NVM for Windows 之前卸载任何现有版本的 Node.js&#xff08;否则你会遇到版本冲突…

拜耳阵列(Bayer Pattern)以及常见彩色滤波矩阵(CFA)

一、拜耳阵列的来源 图像传感器将光线转化成电流&#xff0c;光线越亮&#xff0c;电流的数值就越大&#xff1b;光线越暗&#xff0c;电流的数值就越小。图像传感器只能感受光的强弱&#xff0c;无法感受光的波长。由于光的颜色由波长决定&#xff0c;所以图像传播器无法记录…

数字化档案管理系统解决方案

数字化档案管理系统解决方案是指将传统的纸质档案转化为数字化档案&#xff0c;采用计算机和网络技术实现对档案的存储、检索、管理、共享等操作的过程。 专久智能数字化档案管理解决方案及措施可以包括以下几个方面&#xff1a; 1. 采用数字化技术对档案进行数字化处理&#x…

掌握接口自动化测试,看这篇文章就够了,真滴简单

前言&#xff1a; 接口测试在我们测试工作当中&#xff0c;经常会遇到&#xff0c;对于接口自动化操作&#xff0c;也越来越多的公司进行实践起来了&#xff0c;市面上有很多工具可以做接口自动化比如&#xff1a;Postman、JMeter、SoapUI等。这一篇安静主要介绍通过代码的形式…

记feign调用第三方接口时header是multipart/form-data

1.请求第三方接口&#xff0c;用feign请求 请求第三方接口&#xff0c;用feign请求&#xff0c;header不通&#xff0c;feign的写法不同 调用时报错Could not write request: no suitable HttpMessageConverter found for request type [com.ccreate.cnpc.mall.dto.zm.ZMPage…