当前位置: 首页 > news >正文

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.lryc.cn/news/625696.html

相关文章:

  • InnoDB为什么使用B+树实现索引?
  • Word——正确调整文字与编号的距离
  • 4.Kotlin 集合 Map 所有方法
  • Linux系统安全补丁管理与自动化部署研究与实现(LW+源码+讲解+部署)
  • Ubuntu 20 各种网卡配置IP的方法
  • pnpm 和 npm 差异
  • MySQL 三大日志:redo log、undo log、binlog 详解
  • Git+Jenkins实战(一)
  • 软件测试核心概念拆解:需求、开发模型与测试模型全解析
  • JVM调优实战指南:从原理到落地的全面优化方案
  • 安装DDNS-go
  • FlexSim-线平衡优化仿真
  • Qt元对象
  • Qt消息队列
  • es7.x es的高亮与solr高亮查询的对比对比说明
  • 使用Tomcat Clustering和Redis Session Manager实现Session共享
  • Auto-CoT:大型语言模型的自动化思维链提示技术
  • 基于“R语言+遥感“水环境综合评价方法技术应用——水线提取、水深提取、水温提、水质提取、水环境遥感等
  • STM32-FreeRTOS快速入门指南(下)
  • LLM 中 token 简介与 bert 实操解读
  • 字符串与算法题详解:最长回文子串、IP 地址转换、字符串排序、蛇形矩阵与字符串加密
  • 基于SpringBoot+Vue的写真馆预约管理系统(邮箱通知、WebSocket及时通讯、协同过滤算法)
  • ProfiNet从站转Modbus TCP网关技术详解
  • Ubuntu Server 22.04 k8s部署服务较时,文件描述符超过限制的处理方法
  • 算法训练营day55 图论⑤ 并查集理论基础、107. 寻找存在的路径
  • 游戏相机震动与武器后坐力实现指南
  • ReLens「Focus DSLR 大光圈虚化相机」v4.1.2 f 解锁付款版 —一款专业大光圈和单反级背景虚化编辑软件
  • 基于 RxJava 构建强大的 Android 文件下载管理器
  • Linux管道
  • 云原生俱乐部-shell知识点归纳(1)