文章目录


1、
实现string类的接口,并完成测试,要求利用深拷贝和深赋值实现
MyString.h

#pragma once
#include<iostream>
class MyString {
private:char* data;//储存字符串内容
public://默认构造函数MyString(const char* str = nullptr);////拷贝构造函数(深拷贝)MyString(const MyString& other);//析构函数~MyString();// 赋值运算符重载MyString& operator=(const MyString& other);//获取字符串长度int length() const;//获取c风格字符串const char* c_str() const;//重载[]运算符char& operator[](int index);//重载==操作符bool operator==(const MyString& other) const;////打印字符串void print() const;// 重载 << 操作符(友元函数)friend std::ostream& operator<<(std::ostream& os, const MyString& str);
};

MyString.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include"MyString.h"
#include<cstring>
MyString::MyString(const char* str )
{if (str == nullptr){	data = new char[1];data[0] = '\0';}else{data = new char[strlen(str)+1];strcpy(data, str);}
}MyString::MyString(const MyString& other) {// strcpy(data, other.data);               // 把 other 的字符串内容复制过来//注意:将对象 other 中的字符串内容(other.data)完整地复制到当前对象的 data 成员变量中。data = new char[strlen(other.data)+1];strcpy(data, other.data);
}MyString::~MyString()
{delete[] data;
}MyString&  MyString:: operator=(const MyString& other)
{if (this == &other) return *this;//如果this和other的地址相同,返回other这个值MyString::~MyString();data = new char[strlen(other.data) + 1];strcpy(data, other.data);return *this;
}
void MyString::print() const
{std::cout << data ;
}//获取字符串长度
int MyString ::length() const
{return static_cast<int>(strlen(data));
}//获取c风格字符串
const char* MyString::c_str() const
{return data;
}
//重载[]运算符
char& MyString::operator[](int index)
{if (index<0 || index>strlen(data)){throw std::out_of_range("Index out of range");}return data[index];
}
//重载==操作符
bool MyString::operator==(const MyString& other) const
{return strcmp(data, other.data)==0;
}// 重载 << 操作符(友元函数)
std::ostream& operator<<(std::ostream& os, const MyString& str)
{os << str.data;return os;
}

test.cpp

#define _CRT_SECURE_NO_WARNINGS 1
#include"MyString.h"
int main()
{////默认构造函数MyString s1("aaaa");std::cout << "s1";s1.print();std::cout << std::endl;////拷贝构造函数(深拷贝)MyString s2 = s1;std::cout << "s2  after  copy ";s2.print();std::cout << std::endl;// 修改原对象不应影响拷贝对象s1[0] = 'h'; // 使用 [] 运算符修改 s1 的第一个字符std::cout << "Modified s1: " << s1 << std::endl;std::cout << "s2 remains unchanged: " << s2 << std::endl;// 测试赋值操作符MyString s3;s3 = s1;std::cout << "s3 after assignment: " << s3 << std::endl;// 测试比较操作符if (s1 == s3) {std::cout << "s1 and s3 are equal." << std::endl;}// 测试长度std::cout << "Length of s1: " << s1.length() << std::endl;return 0;
}

在这里插入图片描述
遇到的问题:
实现MyString
1、data = new char[空间+1](必须是data)
2、strcpy(目标,旧文件)
3、 析构 delete[] data;
4、 strcpy(data, other.data); // 把 other 的字符串内容复制过来
注意:将对象 other 中的字符串内容(other.data)完整地复制到当前对象的 data 成员变量中。
5、return static_cast(strlen(data));
static_cast 的作用
static_cast 是 C++ 的显式类型转换运算符,用于在编译时进行安全的类型转换。
这里将 size_t(无符号)转换为 int(有符号),可能出于以下原因:
兼容性:某些旧代码或接口可能要求 int 类型的长度。
明确意图:开发者明确知道字符串长度不会超过 INT_MAX(int 的最大值),并希望消除编译器关于有符号/无符号比较的警告。

6、const char* MyString::c_str() const {
return data;
}
返回类型 const char*
返回一个指向常量字符(const char)的指针,意味着调用者不能通过该指针修改字符串内容。
这是为了保护 MyString 内部数据(data)不被意外修改。
函数名 c_str()
模仿 C++ 标准库 std::string 的接口,用于返回一个 C 风格字符串(以 \0 结尾的字符数组)。
通常用于与其他 C 风格字符串接口兼容(如 printf、文件操作等)。
const 修饰符(函数末尾)
表示这是一个常量成员函数,即该函数不会修改类的任何成员变量(除非成员被声明为 mutable)。
允许在 const MyString 对象上调用此函数。
7、throw std::out_of_range(“Index out of range”); 的作用是 抛出一个 C++ 标准库中的 std::out_of_range 异常,通常用于表示某个索引(下标)超出了有效范围。
8、 os << str.data; // 将 MyString 内部的字符数据(data)输出到流 os
return os; // 返回流对象,支持链式调用(如 cout << a << b)
9.友元函数// 重载 << 操作符(友元函数)
friend std::ostream& operator<<(std::ostream& os, const MyString& str);

以上就是今天练习的内容。。

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

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

相关文章

深入浅出Kafka Producer源码解析:架构设计与编码艺术

一、Kafka Producer全景架构 1.1 核心组件交互图 #mermaid-svg-L9jc09hRQCHb0ftl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-L9jc09hRQCHb0ftl .error-icon{fill:#552222;}#mermaid-svg-L9jc09hRQCHb0ftl .erro…

微软AutoGen:多智能体协作的工业级解决方案

微软AutoGen&#xff1a;多智能体协作的工业级解决方案 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&#xf…

终端安全管理系统为什么需要使用,企业需要的桌面管理软件

在当今数字化高度发展的时代&#xff0c;企业和组织的运营计算机等&#xff0c;是企业业务流程的重要节点。终端安全管理系统正挥着至关重要的作用。保障数据安全终端设备往往存储着企业的核心数据&#xff0c;终端安全管理系统可以保障安&#xff0c;未经授权的人员也无法获取…

补环境基础(一) 原型与原型链

1.创建对象的几种方式 1.对象字面量模式 直接使用{}定义键值对&#xff1a; const obj { key: value }; 2.Object()构造函数模式 使用内置构造函数&#xff08;较少使用&#xff09;&#xff1a; const person new Object(); console.log(person)//输出 {}3.构造函数模…

Qt+yolov8目标识别

这是一个基于ONNX Runtime的YOLOv8目标检测项目&#xff0c;支持CPU和GPU加速&#xff0c;使用Qt框架构建图形化界面。摄像头实时画面识别视频文件识别&#xff0c;能正常识别目标&#xff1a;红绿灯&#xff0c;人&#xff0c;公交&#xff0c;巴士&#xff0c;摩托车 等YOLOv…

NLP分词notes

BPE 贪心提取所有出现频率高的成为词。 BPE的训练流程 1.初始化&#xff1a;将所有单个字符作为初始词汇表的元素。 2.迭代合并&#xff1a; 统计语料中所有相邻符号对&#xff08;包括字符和合并后的符号&#xff09;的出现频率。找到出现频率最高的符号对&#xff0c;将其合并…

【数据结构】栈和队列-----数据结构中的双生花

文章目录[toc]栈与队列&#xff1a;数据结构中的双生花1. 栈&#xff1a;后进先出的有序世界1.1 概念及结构剖析1.2 实现方式深度解析数组 vs 链表实现1.3 动态栈实现详解&#xff08;附程序源码&#xff09;1.定义一个动态栈2.初始化3.销毁4.入栈5.出栈6.取栈顶数据7.判空8.获…

Mybatis-2快速入门

学习主线 必学必会属于优化的东西。 快速入门需求说明 要求&#xff1a;开发一个MyBatis项目&#xff0c;通过MyBatis的方式可以完成对monster表的crud操作 1.创建mybatis数据库-monster表 主键Primary Key默认非空Not null&#xff0c;就省略了 create database mybatis us…

Web基础 -java操作数据库

一、JDBCJDBC&#xff1a;&#xff08;Java DataBase Connectivity&#xff09;&#xff0c;就是使用Java语言操作关系型数据库的一套API。为了使用JDBC操作数据库&#xff0c;首先&#xff0c;我们需要在pom.xml文件中引入依赖<dependencies><!-- MySQL JDBC driver …

cell2location复现

https://github.com/BayraktarLab/cell2location/issues/348 根据你已下载的本地 wheel 文件&#xff0c;可以通过以下方式修改安装命令&#xff0c;优先从本地路径安装 jaxlib&#xff0c;同时保持其他依赖的安装方式不变&#xff1a; 解决方案 # 安装 jax (从远程 PyPI 源) p…

什么是 npm、Yarn、pnpm? 有什么区别? 分别适应什么场景?

什么是 npm、Yarn、pnpm? 有什么区别? 分别适应什么场景? 在前端开发中&#xff0c;包管理工具扮演着非常重要的角色。它们帮助开发者高效地管理项目的依赖&#xff0c;确保项目中所需的所有第三方库和工具都能按时安装&#xff0c;并且兼容版本。npm、Yarn 和 pnpm 是三款…

深度隐匿源IP:高防+群联AI云防护防绕过实战

隐蔽性挑战 黑客常通过以下手段绕过基础防护&#xff1a; HTTPS证书嗅探&#xff1a;访问 https://源站IP&#xff0c;通过证书域名匹配暴露真实IP历史解析记录追踪&#xff1a;从DNS数据库获取旧A记录CDN缓存渗透&#xff1a;利用边缘节点回源漏洞定位源站 三重防护方案 高防I…

如何加快golang编译速度

跟着我的步骤来&#xff1a;第一步&#xff1a;(点击edit)第二步&#xff1a;将go tool arguments设置为-p4&#xff0c;初始值设为4&#xff0c; 代表最多同时编译4个包&#xff08;非文件&#xff09;。电脑性能好时&#xff0c;可设为CPU最大核心数&#xff08;充分利用多核…

浏览器自动化方案

B端后台列表页自动新增素材方案 我设计了一套完整的浏览器自动化方案&#xff0c;使用 Puppeteer 实现B端后台列表页的自动新增素材功能。该方案包含数据组织、浏览器操作、错误处理等完整流程。 一、技术选型 浏览器自动化工具&#xff1a;Puppeteer (https://pptr.dev)任务调…

MPPT电路设计

反激的具体计算过程要写好起码要一天&#xff0c;所以本次先更MPPT。这章不计算具体参数&#xff0c;只做分析。 目录 一、电路作用 二、电路设计 采样电路和输入电路 主体电路 驱动电路 一、电路作用 MPPT电路是一种广泛应用于光伏发电、风力发电等新能源系统中的关键电…

【基于飞浆训练车牌识别模型】

基于飞浆训练车牌识别模型 基于飞浆训练车牌识别模型 LPRNet&#xff08;License Plate Recognition via Deep Neural Networks&#xff09;是一种轻量级卷积神经网络&#xff0c;专为端到端车牌识别设计&#xff0c;由Intel IOTG Computer Vision Group的Sergey Zherzdev于201…

No module named ‘sklearn‘

1、运行python数据分析库时报错 No module named sklearn2、原因 虚拟环境未安装 sklearn 库&#xff08;即 scikit-learn&#xff09;。 3、解决方案 pip install scikit-learn使用国内镜像源&#xff1a; pip install scikit-learn -i https://mirrors.aliyun.com/pypi/simpl…

XPath注入攻击详解:原理、危害与防御

什么是XPath注入&#xff1f; XPath注入&#xff08;XPath Injection&#xff09;是一种针对使用XPath查询语言的应用程序的安全攻击技术&#xff0c;类似于SQL注入。当应用程序使用用户提供的输入来构造XPath查询而没有进行适当的过滤或转义时&#xff0c;攻击者可以通过构造恶…

网络编程(套接字)

目录 一、套接字 1、套接字的作用 2、关于TCP和UDP协议 1. TCP协议 2. UDP协议 3. 两者的区别 2、套接字函数 1&#xff09;函数 socket&#xff08;创建套接字同文件描述符&#xff09; 2&#xff09;准备套接字用结构体 1. 套接字的结构体 2. 客户端的套接字&…

R语言安装包

# 在安装过程中指定源地址 install.packages("RCurl", repos "https://mirrors.tuna.tsinghua.edu.cn/CRAN/") # 查看当前镜像 options()$repos # 设置为中科大镜像 options("repos" c(CRAN"https://mirrors.ustc.edu.cn/CRAN/")…