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++判断水仙花数并输出示例代码》水仙花数是指一个三位数,其各位数字的立方和恰好等于该数本身,:本文主要介绍利用c++判断水仙花数并输出的相关资料,文中通过代码介绍的非常详细,需要的朋友可以... 以下是使用C++实现的相同逻辑代码:#include <IOStream>#include <vec

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

Python字符串处理方法超全攻略

《Python字符串处理方法超全攻略》字符串可以看作多个字符的按照先后顺序组合,相当于就是序列结构,意味着可以对它进行遍历、切片,:本文主要介绍Python字符串处理方法的相关资料,文中通过代码介... 目录一、基础知识:字符串的“不可变”特性与创建方式二、常用操作:80%场景的“万能工具箱”三、格式化方法

浅析python如何去掉字符串中最后一个字符

《浅析python如何去掉字符串中最后一个字符》在Python中,字符串是不可变对象,因此无法直接修改原字符串,但可以通过生成新字符串的方式去掉最后一个字符,本文整理了三种高效方法,希望对大家有所帮助... 目录方法1:切片操作(最推荐)方法2:长度计算索引方法3:拼接剩余字符(不推荐,仅作演示)关键注意事

C++ 右值引用(rvalue references)与移动语义(move semantics)深度解析

《C++右值引用(rvaluereferences)与移动语义(movesemantics)深度解析》文章主要介绍了C++右值引用和移动语义的设计动机、基本概念、实现方式以及在实际编程中的应用,... 目录一、右值引用(rvalue references)与移动语义(move semantics)设计动机1

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造