關於c++中的複合型別
阿新 • • 發佈:2018-11-03
目錄
- 陣列
- 字串
- 結構體
- 共用體
- 列舉
- 指標
- 數和指標的關係
- 常見的儲存方式
- 陣列替代品
一、陣列
- 儲存在每個元素中值的型別
- 陣列名
- 陣列中的元素數
- 通用格式:typename arrayname [arraysize];
- 陣列從0開始編號,在最後一個元的索引,比陣列長度小1
- 初始化時可以用大括號{}為元素賦值,中間用逗號隔開。如果只對陣列一部分進行賦值,則編譯器把其他賦予0
- c++11新增陣列初始化可以不用=。大括號可以不包含任何東西,預設全為0 。
- 禁止縮窄轉換,如浮點型轉整型,int a[]={3.6,1,2.0}; //is not allowed;
- 字串輸入
- cin通過空白(空格,製表符,換行符)來確定字串結束的位置
- getline()函式通過回車和換行符來確定結束,屬於每次讀取一行字串
- 呼叫該函式可使用cin.getline(變數名,長度)
- 當將一行資料輸入到string類中:getline(cin,str),不需要大小引數
- get()函式中有一種變體屬於面向行輸入,跟geiline類似,但get不會丟棄換行符,需要呼叫get()函式不帶引數的變體,否則將影響輸入。
- cin.get((name,ArSize); cin.get(); 或者cin.get((name,ArSize).get();
- get讀取空白行後將設定失效符,意味著接下來的輸入將會被阻斷
- 可以使用恢復命令cin.clear()
- 使用getline使輸入方便,使用get使輸入仔細,如知道停止輸入的原因是已經讀取到正整行資料,而不是陣列過小。
- char 型陣列
- strlen(陣列名)確定該陣列字串長度。
- sizeof(陣列名)運算子指出整個陣列的長度,strcpy(陣列一,陣列二)將陣列2複製到陣列1,陣列一中原有資料清空,
- strncpy(陣列一,陣列二,字元數),比strcpy接受多一個引數,複製的數量
- strcat(陣列1,陣列2)將陣列2追加到陣列1中
- 注意新增標頭檔案cstring,比較舊的編譯器中為string.h。
- string類
- 使用string時要使用標頭檔案,且在於using namespace std之前;string類隱藏了字串的性質,讓您能夠像處理普通變數那樣處理字串。
- 運用時直接定義string類的物件為簡單變數:string str1; string str2="chengjunfeng";
- 使用string物件時,能夠自動處理string大小,從理論上來說,char陣列可以看成一組儲存一個字串的char儲存單元,而string類變數是一個表示字串的實體。
- string簡化了字串合併的操作,直接使用運算子+將兩個string物件結合起來,使用=將出現複製,也可以用+=將字串追加到string物件末尾。str1.size()可以返回str1的長度大小。
- 通過運用行輸入getline()函式,需要這樣表示:getline(cin,str);因為getline不是string類的方法,它將cin作為引數,指出去哪裡查詢輸入。
- 相對於陣列,string不必擔心字串會越界以及可以更簡單操作字串
- 結構是類的基石,結構是使用者定義的型別,而結構宣告定義了這種型別資料的屬性
- 結構的組成部分:
- 結構定義變數後,可以用運算子(.)來訪問各個成員如:
- 結構也可以定義結構陣列變數,有著陣列的特性;cheng feng[2]
- c++提倡使用外部結構宣告,不提倡外部變數,
- 通過使用new建立動態結構:
- 建立結構
- 結構型別和new :要建立一個未命名的inflatable型別,並將地址付給一個指標
- iniflatable *ps=new inflatable/////把儲存inflatable結構的一塊可用記憶體地址賦給ps
- 訪問其成員
- 建立動態結構不能通過成員運算子句點用於結構名,要用箭頭成員運算子(->)
- 計算機儲存資料時必須跟蹤3種基本特性:
-
- 資訊儲存在哪裡
- 儲存的值為多少
- 儲存的資訊是什麼型別
- 指標是一個變數,用於儲存值的地址,指標名錶示的是地址,其儲存的是值的地址而不是值本身,要找值的本身需要用解除引用符 * 。
- 常規變數可以用地址運算子 & 找到它的位置;顯示地址時,cout使用16進製表示法。
- 宣告和初始化指標:
- 一定要在對指標解除引用前,將指標初始化為一個確定、適當的地址。
- 當需要記憶體時用new獲取,不需要時用delete歸還給記憶體池
- new運算子:使用new,c++會自動為你分配記憶體
- 使用new自動賦予地址
- 型別 * 變數名 =new 型別 ; int* a=new int;
- 使用new 和delete 時要遵守一下規則
- 不要使用後delete 來釋放不是new 分配的地址
- 不要使用delete釋放一個記憶體塊兩次
- 如果使用new[ ]為陣列分配記憶體,則應使用delete來釋放
- 如果使用new為一個實體分配記憶體,則直接用delete來釋放
- 對空指標使用delete是安全的
- 如果使用new後沒有用delete釋放記憶體,在自由儲存空間上動態分配的變數或結構也將繼續存在,實際上將會無法訪問自由儲存空間中的結構,因為指向這些記憶體的指標將無效,俗稱“記憶體洩漏”。這些記憶體被分配出去但無法收回
- 避免造成記憶體洩漏將同時使用new和delete
- 如果給out提供一個指標,將列印其地址,如果指標為char*,則列印其指向的字串,需列印地址,則必須將這種指標型別強制轉化成另一種型別,如(int*)
- 在編譯時給陣列分配記憶體時稱為靜態編聯,即陣列在編譯時設定長度所需記憶體,使用new [ ] 的陣列稱為動態編聯,即將在執行時自動為陣列分配空間。在執行時需要就建立,不需要就不建立。特就是說執行時建立優於編譯時建立。
- 陣列名被解釋為第一個元素的地址,但是運用了地址運算子時,得到的是整個陣列的地址。
- 陣列的本質是一種特殊的指標,陣列的地址是連在一起的,指標是分散的;陣列a[0]時指標指向第一個地址,當a[0+1]是指標自動跳到下一個地址,如陣列a為int則&a[0]比&a[1]少8。
- 對於陣列n:
-
- *(n+i)=n[i] //// n[0] 表示*n,即陣列n的首地址。 n[3]表示*(n+3) 即陣列n的首地址加3個單位
- 陣列名被解釋為第一個元素的地址,但是運用了地址運算子時,得到的是整個陣列的地址
- 為陣列分配記憶體的通用格式
-
- type _name * pointer_name =new type _name [num_elements] int *a=new int [3];
- 這樣可以把指標名當做陣列名使用
- c++允許將指標與整數相加減,指標陣列P指的是P[0],P=P+1後P指向P[1],即指向指標的下一個元素地址。
- char 陣列名、char指標及用引號括起來的字串常量都被解釋為字串第一個字元的地址
- 自動儲存
- 函式內部定義的常規變數使用自動儲存空間,稱為自動變數
- 函式呼叫時自動產生,函式結束時自動消亡
- 即自動儲存的變數為區域性變數
- 靜態儲存
- 函式外面的變數即全域性變數
- 關鍵字static聲名的變數
- 動態儲存
- 使用new和delete管理記憶體池為變數分配地址,資料的生命週期不受程式和函式的生存空間控制
- 使用new和delete讓我們使用記憶體有更大的管理權
- 模板類vector
- vector是一種動態陣列,他是使用new建立動態陣列的替代品,內部自動使用new和delete來管理記憶體。
- 使用vector物件,首先要包含標頭檔案vector,它包含在空間std中,所以要在using之前使用標頭檔案
- vector<資料型別> 物件名 (長度,滿了之後擴充數量);
- 可以在執行時設定vector物件長度,可在末尾追加新資料也可以在中間插入資料
- vector的擴充機制:按照容器現在容量的一倍進行增長。vector容器分配的是一塊連續的記憶體空間,每次容器的增長,並不是在原有連續的記憶體空間後再進行簡單的疊加,而是重新申請一塊更大的新記憶體,並把現有容器中的元素逐個複製過去,然後銷燬舊的記憶體。
- 模板類arrary(c++11)
- 建立array物件,需新增arrary標頭檔案
- arrary<typename,長度> 物件
- 可以將一個arrary物件賦予另一個arrary物件