C++代码解释:实现一个 mystring 类,用于表示字符串,实现构造函数,默认构造长度为 10 的空间,提供打印字符串,获取空间大小,修改内容的成员函数

题目

代码

#include <cstring>   // 包含字符串处理函数库,如strlen、strncpy等
#include <iostream>  // 包含输入输出流库,用于cout等操作
using namespace std;  // 使用标准命名空间,避免重复书写std::class mystring {  // 定义mystring类,用于字符串处理
private:          // 私有成员,仅类内部可访问char* str;    // 指向动态分配的字符数组,存储字符串内容size_t len;   // 存储字符串占用的空间大小(包括结束符'\0')public:  // 公有成员,类外部可访问// 默认构造函数,创建长度为10的空字符串mystring() : len(10) {  // 初始化列表,将len初始化为10str = new char[len];  // 动态分配长度为len的字符数组// 初始化为空字符串str[0] = '\0';  // 将第一个字符设为结束符,代表空字符串}// 打印字符串内容(const成员函数,不修改对象状态)void print() const {cout << str << endl;  // 输出字符串内容并换行}// 获取空间大小(const成员函数,不修改对象状态)size_t getSize() const {return len;  // 返回字符串占用的空间大小}// 修改字符串内容,确保不越界void setContent(const char* newStr) {  // 参数为常量字符串指针,避免修改源字符串// 取新字符串长度和现有空间较小值(减1是预留结束符位置),防止越界size_t newLen = min(strlen(newStr), len - 1);  // strlen获取新字符串实际长度strncpy(str, newStr, newLen);  // 安全复制字符串,最多复制newLen个字符// 确保以'\0'结尾,避免输出乱码str[newLen] = '\0';  // 在复制的字符末尾添加结束符}// 析构函数,释放动态分配的内存,防止内存泄漏~mystring() {delete[] str;  // 释放动态分配的字符数组}
};// 测试mystring类的功能
int main() {mystring s;  // 创建mystring类的对象s,调用默认构造函数cout << "空间大小: " << s.getSize() << endl;  // 输出对象s的空间大小s.setContent("Hello");  // 调用setContent方法,设置字符串为"Hello"cout << "字符串内容: ";  // 输出提示信息s.print();  // 调用print方法,输出字符串内容s.setContent("World! Long Text");  // 设置较长的字符串(会被截断以适应空间)cout << "修改后内容: ";  // 输出提示信息s.print();  // 输出修改后的字符串内容return 0;  // 程序正常结束
}

关键点说明:

  1. 构造函数mystring() 中动态分配内存,默认创建长度为 10 的字符数组,并初始化为空字符串。
  2. setContent:用 strncpy 保证不会越界,最后手动加 '\0' 确保字符串正确结束。
  3. 析构函数:用 delete[] 释放动态分配的内存,避免内存泄漏。
  4. const 成员函数print 和 getSize 不会修改对象状态,标记为 const 更安全。


从代码设计角度来看,是否使用 protected(保护成员),取决于类的 继承需求 和 设计意图 。以下从几个维度解释当前代码没用到 protected 的原因,以及何时适合用 protected :

1. 类的定位:无需继承扩展

当前 mystring 类是一个 独立功能类 ,设计目标是封装字符串的基础操作(构造、打印、修改内容等),没有考虑让其他类继承它 。

  • protected 的核心作用是 给子类开放访问权限 (子类可访问父类的 protected 成员,外部类 / 函数不行 )。
  • 如果类不需要被继承扩展,所有成员用 private(隐藏实现细节) + public(开放对外接口) 即可,protected 就用不上。

2. 设计原则:隐藏实现细节

代码里 str 和 len 是 private ,这是 封装思想 的体现:

  • private 强制外部代码通过 public 接口(如 printgetSizesetContent )操作类,避免直接篡改内部状态(比如直接修改 str 指针导致内存混乱 )。
  • 如果把 str 或 len 设为 protected ,子类继承后能直接访问 / 修改它们,可能破坏父类的封装逻辑(比如子类不小心改坏 str 指针,父类功能就会异常 )。

3. 何时需要 protected ?

如果有 继承扩展场景 ,比如:

// 假设要继承 mystring 扩展功能
class myAdvancedString : public mystring {
public:void doSomething() {// 子类想直接访问父类的 len(假设 len 是 protected)// 如果父类 len 是 private,这里会编译报错;是 protected 则可以访问size_t parentLen = len; // ... 基于父类状态扩展逻辑}
};

这种情况下,若希望 子类能访问父类的部分内部成员 (但又不想完全开放给外部 ),就可以把这些成员设为 protected 。

总结

当前 mystring 类因为 不需要被继承 ,所以用 private 隐藏实现、public 开放接口就足够,无需 protected 。如果未来有继承扩展需求,再根据实际场景(需要子类访问哪些内部成员 )决定是否引入 protected 。

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

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

相关文章

如何解决IDEA/Datagrip无法连接数据库的问题:解决方法为添加参数-Djava.net.preferIPv4Stack=true

如何解决IDEA/Datagrip无法连接数据库的问题&#xff1a;解决方法为添加参数-Djava.net.preferIPv4Stacktrue 引言 在开发过程中&#xff0c;我们常常使用集成开发环境&#xff08;IDE&#xff09;如 IntelliJ IDEA 或 JetBrains DataGrip 来与数据库进行交互。然而&#xff…

走进数字时代,融入数字生活,构建数字生态

一、准备在IT行业深耕十七年&#xff0c;始终专注于企业生产经营中的实际应用问题&#xff0c;历经开发、测试、运维、实施、架构设计等多个技术岗位&#xff0c;并参与肉制品的生产与销售业务&#xff0c;推进了企业主业的市场管理落地&#xff0c;积累了业务与信息技术融合的…

【Vue开发】在Vite+Vue3项目中实现离线Iconify图标方案

在ViteVue3项目中实现离线Iconify图标方案 项目背景 当前项目需要部署到无网络连接的离线环境&#xff0c;因此需要将Iconify图标集打包到项目构建结果中&#xff0c;实现完全离线使用。 技术环境 框架: Vue 3构建工具: Vite核心依赖:"iconify/json": "^2.2…

Kotlin 协程之Channel

前言 在之前的文章中&#xff0c;我们已经知道了协程的启动、挂起、取消、异常以及常用的协程作用域等基础应用。 这些基础应用适合的场景是一次性任务&#xff0c;执行完就结束了的场景。 launch / async 适合的场景 网络请求数据库查询文件读写并行计算任务等等 Channel …

linux系统装google chrome,amd64

google chrome官网最下边其他平台&#xff0c;linux 查看自己的系统架构&#xff08;用下边这行代码查看&#xff09;&#xff0c;看看是amd还是 &#xff0c;我的显示amd64&#xff0c;amd对应.deb,rpm对应x86 &#xff0c;选择下载 dpkg --print-architecture 然后 sudo…

【C++基础】C++ 中const与volatile关键字深度解析:从面试考点到底层实现

在 C 开发岗位的面试中&#xff0c;const与volatile关键字是高频考点之一。这两个关键字看似简单&#xff0c;但实际上蕴含着丰富的语义和底层机制。本文从基础语法到高级应用&#xff0c;结合大厂真题&#xff0c;深入解析这两个关键字的奥秘。一、const关键字&#xff1a;常量…

达梦分布式集群DPC_故障分析_yxy

达梦分布式集群DPC_节点故障分析1 DPC核心概念回顾2 场景1-主库故障3 场景2-少数备库故障4 场景3-多数节点故障4.1 多数节点故障&#xff08;包括主库&#xff09;4.2 多数备库节点故障&#xff08;不包括主库&#xff09;1 DPC核心概念回顾 达梦分布式集群DPC&#xff0c;基于…

【高并发内存池】一、简介 定长内存池实现

文章目录Ⅰ. 项目介绍1、这个项目要做什么2、项目的要求Ⅱ. 什么是内存池1、池化技术2、内存池3、mallocⅢ. 设计一个定长内存池1、定长内存池的概念2、实现如何实现定长❓❓❓如何绕开 malloc 向堆直接申请空间❓❓❓3、性能测试Ⅰ. 项目介绍 1、这个项目要做什么 tcmalloc源…

产品设计.原型设计

产品思维&#xff1a; 1. 产品定位&#xff1a;产品的具体的、用户画像&#xff1b; --什么样的人在什么环境下做什么事情的场景 2. 范围层: 发现、识别和决策需求。--识别真假需求&#xff0c;做ROI判断 3. 可复用的、MVP产品方案--要能复用的解决方案&#xff0c;最小可用产品…

vue3+element-plus 输入框el-input设置背景颜色和字体颜色,样式效果等同于不可编辑的效果

应用效果&#xff1a;代码&#xff1a;<template> ......<el-form-item label"文件编号" label-position"right"><el-input v-model"qualityFileForm.fileNo" clearable :disabled"!props.isNew" /></el-form-it…

[ CSS 前端 ] 网页内容的修饰

目录 一. CSS 1. 概述 2. 基本语法 (1)行内样式表 (2)内嵌样式表 (3)外部样式表 3. 选择器 (1)标签选择器: (2)类选择器: (3)通配选择器: (4)后代选择器: 4. 基础样式 (1). 文本样式 (2). 背景样式 (3). 列表样式 5. 伪类 (1)定义: (2)伪类的语法&#xff1a; …

全面深入了解榛树游戏引擎

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;榛树游戏引擎&#xff08;Hazel&#xff09;是一款专为游戏开发设计的先进软件工具&#xff0c;它集成了多种功能&#xff0c;支持现代图形API&#xff0c;具有高性能的物理模拟系统和易学易用的脚本语言&#…

“大模型”技术专栏 | 浅谈基于 Kubernetes 的 LLM 分布式推理框架架构:概览

编者按&#xff1a;人工智能正以前所未有的渗透力重塑生产与生活图景。作为国内领先的数据智能科技企业&#xff0c;和鲸科技自 2015 年成立以来&#xff0c;深耕人工智能与数据科学&#xff0c;历经十年发展&#xff0c;已在气象、教育、医疗、航空航天、金融、通信、能源、零…

【JS】认识并实现一个chrome扩展程序

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍chrome扩展程序。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#…

jeecgboot项目遇见的一些问题:

1.当你想修改项目的标题&#xff0c;前端将jeecgboot改成你想要的标题的时候&#xff0c;去前端的.env文件中进行修改。图1 修改标题根据路径找到文件&#xff0c;将网站标题改成自己需要的就可以正常显示了。图2 显示前图3 显示后2.在动态数组中&#xff0c;如果你知道数组需要…

项目里程碑设定有哪些方法

要科学设定项目里程碑&#xff0c;可采用以下几种方法&#xff1a;基于项目阶段划分法、关键交付物导向法、依赖关系链分析法、时间驱动法、风险节点识别法、目标成果导向法、资源约束分析法、客户验收节点设定法。其中&#xff0c;关键交付物导向法尤为实用。该方法以项目中必…

英伟达显卡驱动怎么更新 详细步骤教程

英伟达显卡驱动程序对于电脑的图形性能至关重要&#xff0c;它能确保显卡在游戏、设计、视频渲染等方面发挥最大性能。如果驱动过旧&#xff0c;可能会导致游戏运行不畅、软件不兼容&#xff0c;甚至系统出现错误。因此&#xff0c;定期更新英伟达显卡驱动非常必要。下面将为大…

基于单片机智能拐杖/导盲杖/老人防摔倒设计

传送门 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目速选一览表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目功能速览 概述 该设计针对老年人及行动不便人群的需求&#xff0c;开发了一款集成单片机控制的智能拐杖。拐杖采…

Node.js完整安装配置指南(包含国内镜像配置)

Node.js完整安装配置指南&#xff08;包含国内镜像配置&#xff09; 一、Node.js安装 方法1&#xff1a;使用Chocolatey安装&#xff08;推荐&#xff09; # 安装最新LTS版本 choco install nodejs# 或安装指定版本 choco install nodejs --version20.11.0方法2&#xff1a;…

AI硬件 - AMD显卡架构演进及产品线

目录 一、AMD显卡架构演进总结 二、典型AMD AI显卡历代型号参数对比表 关键参数说明: 三、AMD 特供中国AI显卡产品线全览 1. 企业级Instinct系列(数据中心/科研) 2. 消费级AI加速显卡(开发/本地推理) 四、与NVIDIA显卡的AI性能对比 关键指标实测数据 五、模型框架…