[C++] string類的介紹與構造的模擬實現,進來看吧,里面有空調

在這里插入圖片描述

文章目錄

  • 1、string類的出現
    • 1.1 C語言中的字符串
  • 2、標準庫中的string類
    • 2.1 string類
  • 3、string類的常見接口說明及模擬實現
    • 3.1 string的常見構造
    • 3.2 string的構造函數
    • 3.3 string的拷貝構造
    • 3.4 string的賦值構造
  • 4、完整代碼

1、string類的出現

1.1 C語言中的字符串

C語言中,字符串是以’\0’結尾的一些字符的集合,為了操作方便,C標準庫中提供了一些str系列的庫函數,但是這些庫函數與字符串是分離開的,不太符合面向對象的思想,而且底層空間需要用戶自己管理,稍不留神可能還會越界訪問。
因此C++中,為了讓我們更簡單、方便、快捷的使用字符串類型,C++提供了string類。

2、標準庫中的string類

2.1 string類

string類文檔介紹
string類在使用的時候我們需要包含頭文件 #include ,以及using namespace std;

  1. 字符串是表示字符序列的類。
  2. 標準的字符串類提供了對此類對象的支持,其接口類似于標準字符容器的接口,但添加了專門用于操作單字節字符字符串的設計特性。
  3. string類是使用char(即作為它的字符類型,使用它的默認char_traits和分配器類型(關于模板的更多信息,請參閱basic_string)。
  4. string類是basic_string模板類的一個實例,它使用char來實例化basic_string模板類,并用char_traits和allocator作為basic_string的默認參數(根于更多的模板信息請參考basic_string)。
  5. 注意,這個類獨立于所使用的編碼來處理字節:如果用來處理多字節或變長字符(如UTF-8)的序列,這個類的所有成員(如長度或大小)以及它的迭代器,將仍然按照字節(而不是實際編碼的字符)來操作。

總結:
1. string是表示字符串的字符串類。
2. 該類的接口與常規容器的接口基本相同,再添加了一些專門用來操作string的常規操作。
3. string在底層實際是:basic_string模板類的別名,
typedef basic_string<char, char_traits, allocator>string;
4. 不能操作多字節或者變長字符的序列。

3、string類的常見接口說明及模擬實現

3.1 string的常見構造

(constructor)函數名稱功能說明
string()構造空的string類對象,即空字符串
string(const char* s)用C-string來構造string類對象
string(size_t n, char c)string類對象中包含n個字符c
string(const string&s)拷貝構造函數
int main()
{string s1; // 構造空的string類對象s1string s2("hello"); // 用C格式字符串構造string類對象s2string s3(s2); // 拷貝構造s3return 0;
}

3.2 string的構造函數

namespace s
{class string{public://string()//	:_str(new char[1]{ '\0' })//這里開一個空間,并賦值為\0,如果直接賦值為nullptr的話//	,_size(0)				  //在實例化一個無參對象后,對對象進行操作的時候會引發空指針異常//	,_capacity(0)//{}//全缺省構造函數string(const char* str = "")//常量字符串默認以\0結尾,因此不需要給: _size(strlen(str)), _capacity(_size){_str = new char[_capacity + 1];//多開一個空間,需要存放\0strcpy(_str, str);//將字符串拷貝到_str}private:char* _str;size_t _size;//有效存儲字符個數size_t _capacity;//實際空間};
}

這里我們用一個全缺省將無參構造與構造都包括了。
這個構造函數很簡單,這里就不多講了,大家應該可以看懂。

3.3 string的拷貝構造

傳統寫法:

//拷貝構造
string(const string& s): _size(strlen(s._str)), _capacity(_size)
{_str = new char[_capacity + 1];strcpy(_str, s._str);
}

現代寫法:

void swap(string& s)
{std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);
}
//現代寫法 s1(s2)
string(const string& s):_str(nullptr),_size(0),_capacity(0)
{string tmp(s._str);//構造swap(tmp);//this->swap(s);
}

庫里提供了交換函數,我們封裝一個交換函數,內部的實現就使用庫里面的swap,我們拷貝構造函數里面先調用構造函數,實例化一個tmp,再將tmp與this交換。

3.4 string的賦值構造

傳統寫法:

string& operator=(const string& s)
{if (this != &s){string tmp(s);//拷貝構造swap(tmp);}return *this;
}

現代寫法:這里與拷貝構造的現代寫法是類似的,不再多說。

void swap(string& s)
{std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);
}
string& operator=(const string& s)
{if (this != &s){string tmp(s);//拷貝構造swap(tmp);}return *this;
}

我們其實可以對現代寫法繼續精簡一下,我們這里參數是引用傳參,我們不用引用就會產生一次拷貝,對拷貝的形參直接進行交換,這樣就可以簡化寫法,但是這里的效率其實是一樣的,都是一次拷貝構造 + 一次交換。

// 極致寫法,效率與上面一樣
string& operator=(string tmp)//參數直接調用拷貝構造
{swap(tmp);return *this;
}

4、完整代碼

#include <string.h>
#include <algorithm>
using namespace std;namespace s
{class string{public://string()//	:_str(new char[1]{ '\0' })//這里開一個空間,并賦值為\0,如果直接賦值為nullptr的話//	,_size(0)				  //在實例化一個無參對象后,對對象進行操作的時候會引發空指針異常//	,_capacity(0)//{}//全缺省構造函數string(const char* str = "")//常量字符串默認以\0結尾,因此不需要給:_size(strlen(str)),_capacity(_size){_str = new char[_capacity + 1];//多開一個空間,需要存放\0strcpy(_str, str);//將字符串拷貝到_str}//拷貝構造// 傳統寫法//string(const string& s)//	:_size(s._size)//	,_capacity(s._capacity)//{//	_str = new char[s._capacity + 1];//	strcpy(_str, s._str);//}void swap(string& s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);}//現代寫法 s1(s2)string(const string& s):_str(nullptr),_size(0),_capacity(0){string tmp(s._str);//構造swap(tmp);//this->swap(s);}//賦值// 傳統寫法//string& operator=(const string& s)//{//	if (this != &s)//	{//		char* tmp = new char[s._capacity];//		strcpy(tmp, s._str);//		delete[] _str;//		_str = tmp;//將tmp字符串直接給_str,類似淺拷貝//		_size = s._size;//		_capacity = s._capacity;//	}//	return *this;//}//現代寫法//string& operator=(const string& s)//{//	if (this != &s)//	{//		string tmp(s);//拷貝構造//		swap(tmp);//	}//	return *this;//}// 極致寫法,效率與上面一樣string& operator=(string tmp)//參數直接調用拷貝構造{swap(tmp);return *this;}~string(){cout << "~string()" << endl;delete[] _str;_size = _capacity = 0;}private:char* _str;size_t _size;//有效存儲字符個數size_t _capacity;//實際空間};
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40509.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40509.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40509.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

「Qt」文件讀寫操作

0、引言 我們知道 C 和 C 都提供了文件讀寫的類庫&#xff0c;不過 Qt 也有一套自己的文件讀寫操作&#xff1b;本文主要介紹 Qt 中進行文件讀寫操作的類 —— QFile。 1、QFileDialog 文件對話框 一般的桌面應用程序&#xff0c;當我們想要打開一個文件時&#xff0c;通常會彈…

php+echarts實現數據可視化實例

效果&#xff1a; 代碼&#xff1a; php <?php include(includes/session.inc); include(includes/SQL_CommonFunctions.inc); ?> <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv&quo…

OpenLayers入門,OpenLayers加載google街景地圖

專欄目錄: OpenLayers入門教程匯總目錄 前言 本章講解OpenLayers加載google街景地圖,無需科學上網,也可以正常訪問瓦片。 二、依賴和使用 "ol": "^6.15.1"使用npm安裝依賴npm install ol@6.15.1使用Yarn安裝依賴yarn add olvue中如何使用: vue項…

FastApi-1-結合sql 增/查demo

目錄 FastAPI學習記錄項目結構部分接口/代碼展示感受全部代碼 FastAPI學習記錄 fastapi已經學習有一段時間&#xff0c;今天抽時間簡單整理下。 官網介紹&#xff1a; FastAPI 是一個用于構建 API 的現代、快速&#xff08;高性能&#xff09;的 web 框架&#xff0c;使用 Py…

SpringBoot的配置文件以及日志設置

在使用SpringBoot開發的過程中我們通常會用到配置文件來設置配置信息 以及使用日志來進行記錄我們的操作&#xff0c;方便我們對錯誤的定位 配置文件的作用在于&#xff1a;設置端口&#xff0c;設置數據庫連接信息&#xff0c;設置日志等等 在SpringBoot中&#xff0c;配置…

Linux系統編程:通過System V共享內存實現進程間通信

目錄 一. 共享內存實現進程間通信的原理 二. 共享內存相關函數 2.1 共享內存的獲取 shmget / ftok 2.2 共享內存與進程地址空間相關聯 shmat 2.3 取消共享內存與進程地址空間的關聯 shmdt 2.4 刪除共享內存 shmctl 2.5 通信雙方創建共享內存代碼 三. 共享內存實現進程間…

承接各種設計

小弟985研究生畢業&#xff0c;目前攻讀讀博士&#xff0c;可做各種設計&#xff0c;包括但不限于Matlab 電力電子/電氣工程&#xff0c;matlab/simulink 電氣專業仿真MATLAB 電氣工程專業&#xff0c;matlab建模 電力電子&#xff0c;電氣工程&#xff0c;電力系統&#xff0c…

vue echarts macd指標 完整代碼

1 邏輯 給指定的series兩個對象 兩個對象有相同的xAxisIndex: 2,yAxisIndex: 2, 不同的data {name: "",type: "line",data: data1,xAxisIndex: 2,yAxisIndex: 2,},{name: "",type: "bar",data: data2,xAxisIndex: 2,yAxisIndex: 2,},…

Mac M2 Pro安裝使用Cocoapods

Mac Pro M2安裝使用Cocoapods 在新公司要做iOS開發&#xff0c;所以在新電腦上安裝Cocoapods 在升級gem&#xff0c;sudo gem update --system&#xff0c;和安裝cocoapods時都遇到如下的提示&#xff1a; ERROR: While executing gem ... (Errno::EPERM)Operation not per…

Linux下安裝nodejs

1、下載nodejs 點擊前往&#xff1a;Download | Node.js 2、解壓 tar -xvf node-v18.16.0-linux-x64.tar.xz mv node-v18.16.0-linux-x64/ /usr/local/nodejs 3、 建立軟鏈接 此時的bin文件夾中已經存在node以及npm&#xff0c;如果你進入到對應文件的中執行命令行一點問題…

現代C++:使用 shared_from_this 防止 this 提前被釋放

首先概括一下shared_from_this的作用&#xff1a;可以在類的成員函數中直接通過this得到指向當前所在對象的shared_ptr的智能指針&#xff0c;具體操作如下。 使用方法 設需要提供shared_from_this方法的類為C0定義為類&#xff0c;首先需要將C0定義為 std::enable_shared_fr…

mysql 02 數據庫的約束

為防止錯誤的數據被插入到數據表&#xff0c;MySQL中定義了一些維護數據庫完整性的規則&#xff1b;這些規則常稱為表的約束。常見約束如下&#xff1a; 主鍵約束 主鍵約束即primary key用于唯一的標識表中的每一行。被標識為主鍵的數據在表中是唯一的且其值不能為空。這點類似…

前后端分離------后端創建筆記(10)用戶修改

本文章轉載于【SpringBootVue】全網最簡單但實用的前后端分離項目實戰筆記 - 前端_大菜007的博客-CSDN博客 僅用于學習和討論&#xff0c;如有侵權請聯系 源碼&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

Spring Boot實現第一次啟動時自動初始化數據庫流程詳解

隨著互聯網的發展項目中的業務功能越來越復雜&#xff0c;有一些基礎服務我們不可避免的會去調用一些第三方的接口或者公司內其他項目中提供的服務&#xff0c;但是遠程服務的健壯性和網絡穩定性都是不可控因素。 在測試階段可能沒有什么異常情況&#xff0c;但上線后可能會出…

https證書獲取的方法及好處

我們常說的https證書其實就是ssl證書&#xff0c;眼下為網站部署https證書是保障網站安全必不可少的一步。而https證書該如何獲取呢&#xff1f;下面就簡單介紹一下https證書獲取的方法。 https證書獲取途徑有兩種&#xff1a;自己簽發和由受信任的CA機構簽發。 自己給自己簽…

全國三網優惠話費充值接口開發指南

一、文檔綜述 近期想做項目的看過來~三網&#xff08;全國移動、聯通、電信&#xff09;話費、電費充值接口能夠實現將接口接入到小程序或者app上面&#xff0c;通過接口提交號碼和金額進行充值&#xff0c;可以幫助相關人員快速完成接口對接與聯調&#xff0c;平臺用戶可以通…

設計HTML5文本

網頁文本內容豐富、形式多樣&#xff0c;通過不同的版式顯示在頁面中&#xff0c;為用戶提供最直接、最豐富的信息。HTML5新增了很多文本標簽&#xff0c;它們都有特殊的語義&#xff0c;正確使用這些標簽&#xff0c;可以讓網頁文本更嚴謹、更符合語義。 1、通用文本 1.1、標…

算法競賽備賽之搜索與圖論訓練提升,暑期集訓營培訓

目錄 1.DFS和BFS 1.1.DFS深度優先搜索 1.2.BFS廣度優先搜索 2.樹與圖的遍歷&#xff1a;拓撲排序 3.最短路 3.1.迪杰斯特拉算法 3.2.貝爾曼算法 3.3.SPFA算法 3.4.多源匯最短路Floy算法 4.最小生成樹 4.1.普利姆算法 4.2.克魯斯卡爾算法 5.二分圖&#xff1a;染色法…

7. CSS(四)

目錄 一、浮動 &#xff08;一&#xff09;傳統網頁布局的三種方式 &#xff08;二&#xff09;標準流&#xff08;普通流/文檔流&#xff09; &#xff08;三&#xff09;為什么需要浮動&#xff1f; &#xff08;四&#xff09;什么是浮動 &#xff08;五&#xff09;浮…

OpenAI全球招外包大軍,手把手訓練ChatGPT取代碼農 ; 碼農:我自己「殺」自己

目錄 前言 OpenAI招了一千多名外包人員&#xff0c;訓練AI學會像人類一樣一步步思考。如果ChatGPT「學成歸來」&#xff0c;碼農恐怕真的危了&#xff1f; 碼農真的危了&#xff01; 當時OpenAI也說&#xff0c;ChatGPT最合適的定位&#xff0c;應該是編碼輔助工具。 用Cha…