C++string類

在C語言中,用0結束的字符數組表示字符串,有些不方便:1)數組定義後大小不能改變;2)存入的內容只能比數組小,不能大,若是不當心存多了,會引發內存的溢出,這些問題讓程序員有些鬱悶。程序員

C++的string屬於STL(Standard Template Library,標準模板庫)中的定義的類,它會隨存放字符的長度自動伸縮,程序員沒必要擔憂內存溢出的問題,string類還和C語言的字符串之間還能夠很方便的轉換。數據庫

1、string的聲明

首先,爲了在程序中使用string類,必須包含頭文件 \<string\>。以下:數組

#include <string>

注意這裏不是string.h,string.h是C語言字符串頭文件。ide

string是一個模板類,位於std命名空間內,爲方便使用還須要在程序中增長:函數

using namespace std;  // 指定缺省的使名空間。
string str;       // 建立string對象。

若是不指定命名空間,也就是說沒有using namespace std,建立string對象的方法以下:測試

std::string str;

示例(book215.cpp)spa

/*
 * 程序名:book215.cpp,此程序用於演示C++string類。
 * 做者:C語言技術網(www.freecplus.net) 日期:20190525
*/
#include <stdio.h> 
#include <string.h>
#include <string>

using namespace std;

int main () 
{ 
  char str1[31];   // C語言風格的字符串。
  memset(str1,0,sizeof(str1));
  strcpy(str1,"西施");

  string str2;     // C++的string字符串

  str2="沉魚";     // 對str2賦值
  printf("str2=%s\n",str2.c_str());

  // 判斷str2和str1是否相等
  if (str2!=str1) printf("str2=%s,str1=%s,不相等。\n",str2.c_str(),str1);

  strcpy(str1,str2.c_str());   // 把string的內容賦值給C語言風格的字符串。
  printf("str1=%s\n",str1);
}

運行效果.net

在這裏插入圖片描述

2、string的重載的操做符

能夠用=直接賦值。code

能夠用 ==、\>、\<、\>=、\<=、和!=比較字符串。對象

能夠用+或者+=操做符鏈接兩個字符串。

能夠用[]獲取指定位置的字符,相似數組。

3、最重要的一個成員函數

const char *c_str();

string類採用動態分配內存的方式來存放字符串,c_str函數返回這個字符串的地址。

std::string str1;
str1="hello world";
char str2[31];
strcpy(str2,str1.c_str());

4、string特性描述函數

可用下列函數來得到string的一些特性。

int size();             // 返回當前字符串的大小。
int length();           // 返回當前字符串的長度,注意和size的區別。
void clear();           // 清空字符串。

5、string的其它成員函數

string提供了上百個成員函數,很是豐富,豐富得有點眼花,各位本身找資料,有空的時候再研究一下,斷章取義的使用。

6、string的本質

string是一個類,經過動態分配內存,實現對字符串的存儲,咱們來看如下代碼。

示例(book216.cpp)

/*
 * 程序名:book216.cpp,此程序用於演示C++的string類的字符串的地址。
 * 做者:C語言技術網(www.freecplus.net) 日期:20190525
*/
#include <stdio.h> 
#include <string>

int main () 
{ 
  std::string str;

  str="www";
  printf("%p\n",str.c_str());

  str=str+".freecplus";
  printf("%p\n",str.c_str());

  str="freecplus";
  printf("%p\n",str.c_str());

  str="www.freecplus.net";
  printf("%p\n",str.c_str());
}

運行效果

在這裏插入圖片描述

經過以上的例子,咱們能夠看到,string對象用於存放字符的內存地址是變化的,當前空間若是不足,就從新分配一個新的內存,同時會釋放以前的內存,不是什麼神奇的技術。

7、應用經驗

C++的string類是一個變長的字符串,不須要程序員擔憂內存溢出的問題,還提供了不少字符串操做函數,初學者可能會想,用它取代C語言中的字符串(以0結尾的字符數組)必定是個很好的主意。我要告訴各位,這是不可能的,由於string中的字符串存儲的內存空間沒有固定的位置(它也沒辦法有固定位置)。

對初學者來講,用C/C++寫一些簡單的程序,作一些簡單的事情,不懂得實際項目開發的需求,例如Oracle和MySQL數據庫提供的接口,在交換數據的時候須要綁定一個固定的地址,string是作不到的。

個人建議是採用string存放一些須要動態分配內存的臨時數據,避開動態內存技術帶來的坑,而後轉換爲C的字符串。C的字符串沒有string類那麼豐富的成員函數,這個不是問題,咱們能夠本身寫,這也是我不想介紹string成員函數的緣由,與其花時間去研究string的成員函數,還不如本身寫一個。

瞭解string類的原理和一些用得着的成員函數就能夠了,沒必要太深刻研究,意義不大。

8、課後做業

上網找C++string的資料,看看它的成員函數和重載的操做符,若是以爲有用,就編寫代碼測試一下,瞭解一下大概狀況。

9、版權聲明

C語言技術網原創文章,轉載請說明文章的來源、做者和原文的連接。
來源:C語言技術網(www.freecplus.net)
做者:碼農有道

若是這篇文章對您有幫助,請點贊支持,或在您的博客中轉發個人文章,謝謝!!!若是文章有錯別字,或者內容有錯誤,或其餘的建議和意見,請您留言指正,很是感謝!!!

相關文章
相關標籤/搜索