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
英文地址,請注明出處:http://en.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性能對比 關鍵指標實測數據 五、模型框架…