C 基礎教程物件導向(學習筆記(94))

2021-09-02 18:41:55 字數 2242 閱讀 9767

標準庫包含許多有用的類,但最有用的可能是std :: string。std :: string(和std :: wstring)是乙個字串類,它提供許多操作來分配,比較和修改字串。在本章中,我們將深入研究這些字串類。

注意:c風格的字串將被稱為「c風格的字串」,而std :: strings(和std :: wstring)將簡稱為「字串」。

字串類

c風格的字串有許多缺點,主要圍繞著你必須自己完成所有記憶體管理的事實。例如,如果要將字串「hello!」分配給緩衝區,則必須首先動態分配正確長度的緩衝區:

char *strhello = new char[7];
不要忘記為null終止符佔乙個額外的字元!

然後你必須實際複製值:

strcpy(strhello, "hello!");
希望你的緩衝區足夠大,那樣才會沒有緩衝區溢位!

當然,因為字串是動態分配的,所以當你完成它時你必須記住正確地釋放它:

delete strhello;
不要忘記使用陣列刪除而不是正常刪除!

此外,c提供用於處理數字的許多直觀運算子(例如賦值和比較)根本不適用於c風格的字串。有時這些似乎可以工作,但實際上會產生不正確的結果, 例如,使用==比較兩個c風格的字串實際上會進行指標比較,而不是字串比較。使用operator =將乙個c風格的字串分配給另乙個字串似乎首先工作,但實際上是在做乙個指標副本(淺拷貝),這通常不是你想要的。這些事情可能導致程式崩潰,很難找到和除錯!

最重要的是,使用c風格的字串需要記住許多關於什麼是安全/不安全的挑剔規則,記住一堆具有有趣名稱的函式,如strcat()和strcmp(),而不是使用直觀的運算子,並有很多手動記憶體管理。

幸運的是,c ++和標準庫提供了一種更好的處理字串的方法:std :: string和std :: wstring類。通過使用建構函式,析構函式和運算子過載等c ++概念,std :: string允許您以直觀和安全的方式建立和操作字串!沒有更多的記憶體管理,沒有更奇怪的函式名稱,並且災難的可能性大大降低。

字串概述

#include
字串頭中實際上有3個不同的字串類。第乙個是名為basic_string <>的模板化基類:

namespace std

您不會直接使用此類,因此不要擔心目前的特徵或分配器是什麼。在幾乎所有可以想象的情況下,預設值都足夠了。

標準庫提供了兩種basic_string <>:

namespace std

這些是您實際使用的兩個類。std :: string用於標準的ascii(utf-8)字串。std :: wstring用於寬字元/ unicode(utf-16)字串。utf-32字串沒有內建類(儘管如果需要,你應該可以從basic_string <>擴充套件自己的類)。

雖然您將直接使用std :: string和std :: wstring,但所有字串函式都在basic_string <>類中實現。string和wstring能夠通過模板化直接訪問該函式。因此,所有呈現的函式都適用於字串和wstring。但是,因為basic_string是乙個模板化的類,所以當你用字串或wstring執行語法錯誤時,編譯器也會產生可怕的模板錯誤。不要被這些錯誤所嚇倒; 他們看起來比他們實際的簡單得多!

這是字串類中所有函式的列表。這些功能中的大多數具有多種風格來處理不同型別的輸入,我們將在下一課中更深入地介紹這些函式。

雖然標準庫字串類提供了許多功能,但有一些值得注意的:

正規表示式支援

用於從數字建立字串的建構函式

大寫/大寫/小寫函式

不區分大小寫的比較

將字串標記/拆分為陣列

空白修剪

格式化字串sprintf樣式

從utf-8轉換為utf-16,反之亦然

對於其中的大多數,您必須編寫自己的函式,或者將字串轉換為c風格的字串(使用c_str())並使用提供此功能的c函式。

在接下來的課程中,我們將更深入地研究字串類的各種函式。雖然我們將使用字串作為示例,但一切都同樣適用於wstring。

C 基礎教程物件導向(學習筆記5(2))

在編寫具有多個建構函式的類 大多數建構函式 時,必須為每個建構函式中的所有成員指定預設值會導致冗餘 如果更新成員的預設值,則需要觸控每個建構函式。從c 11開始,可以直接為普通類成員變數 不使用static關鍵字的變數 提供預設初始化值 class rectangle void print int ...

C 基礎教程物件導向(學習筆記(23))

過載一元運算子 與您目前看到的運算子不同,正 負 和邏輯非 運算子都是一元運算子,這意味著它們只能在乙個運算元上執行。因為它們僅對它們所應用的物件進行操作,所以通常將一元運算子過載實現為成員函式。所有三個運算元都以相同的方式實現。讓我們看一下我們如何在前面的例子中使用的cents類上實現operat...

C 基礎教程物件導向(學習筆記(24))

過載比較運算子相對簡單,因為它們遵循我們在過載其他運算子時看到的相同模式。因為比較運算子都是不修改左運算元的二元運算子,所以我們將使過載的比較運算子宣告為友元函式。這是乙個帶有過載運算子 和operator!的car類的示例。include include class car friend bool...