C++学习Day05之强化训练---字符串类封装

2024-02-18 21:28

本文主要是介绍C++学习Day05之强化训练---字符串类封装,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 一、程序及输出
    • 1.1 头文件
    • 1.2 cpp文件
    • 1.3 主程序
  • 二、分析与总结


一、程序及输出

1.1 头文件

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(char  * str);//拷贝构造MyString(const MyString & str);//重载=运算符 MyString& operator=(const char * str);MyString& operator=(const MyString & str);//重载[]运算符char& operator[](int index);//重载+运算符MyString operator+(const char * str);MyString operator+(const MyString&str);//重载==运算符 bool operator==(const char *str);bool operator==(const MyString &str);//析构~MyString();private:char * pString; //维护在堆区开辟的字符数组int m_Size; //字符串长度 不统计"\0"};

1.2 cpp文件

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){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(char * str)
{//cout << "MyString有参构造函数调用" << endl;this->pString = new char[strlen(str) + 1];strcpy(this->pString, str);this->m_Size = strlen(str);
}MyString::MyString(const MyString & str)
{cout << "拷贝构造函数调用" << endl;this->pString =  new char[strlen(str.pString)+1];strcpy(this->pString, str.pString);this->m_Size = str.m_Size;
}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);this->m_Size = strlen(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);this->m_Size = strlen(str.pString);return *this;
}char& MyString::operator[](int index)
{return this->pString[index];
}MyString MyString::operator+(const char * str)
{//本身 abc   传入 def//计算开辟内存大小int newSize = this->m_Size + strlen(str) + 1;char * temp = new char[newSize];memset(temp, 0, newSize);strcat(temp, this->pString);strcat(temp, str);MyString newString = temp;delete[] temp;return newString;
}MyString MyString::operator+(const MyString&str)
{int newSize = this->m_Size + strlen(str.pString) + 1;char * temp = new char[newSize];memset(temp, 0, newSize);strcat(temp, this->pString);strcat(temp, str.pString);MyString newString = temp;delete[] temp;return newString;
}bool MyString::operator==(const char *str)
{if ( strcmp( this->pString , str) == 0 ){return true;}return false;
}bool MyString::operator==(const MyString &str)
{if (strcmp(this->pString, str.pString) == 0){return true;}return false;
}MyString::~MyString()
{if (this->pString != NULL){//cout << "析构调用" << endl;delete[] this->pString;this->pString = NULL;}}

1.3 主程序

#include<iostream>
using namespace std;
#include "myString.h"void test01()
{MyString str = "abc";cout << str << endl;cout << "请重新给str赋值:" << endl;cin >> str;cout << "str 新的值为: " << str << endl;MyString str2 = str;cout << "str2 = " << str2 << endl;
}void test02()
{MyString str = "abcd";MyString str2 = "aaa";str2 = str;cout << "str2 = " << str2 << endl;cout << "str2[0] = " << str2[0] << endl;str2[0] = 'z';cout << "str2[0]改为z后输出:  " << str2 << endl;MyString str3 = "abc";MyString str4 = "def";MyString str5 = str3 + str4;MyString str6 = str5 + "ghe";cout << "str5 = " << str5 << endl;cout << "str6 = " << str6 << endl;if (str5 == str6){cout << "str5 == str6" << endl;}else{cout << "str5 != str6" << endl;}if ( str6 == "abcdefghe"){cout << "str6 = abcdefghe" << endl;}else{cout << "str6 != abcdefghe" << endl;}
}int main(){test01();test02();system("pause");return EXIT_SUCCESS;
}

输出:
在这里插入图片描述


二、分析与总结

运算符重载的综合使用,方便整体回顾复习。

这篇关于C++学习Day05之强化训练---字符串类封装的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/722498

相关文章

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.