每日一題(沉淀中)

文章目錄


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/")…