1. 程式人生 > >關於c++中的複合型別

關於c++中的複合型別

目錄
  • 陣列
  • 字串
  • 結構體
  • 共用體
  • 列舉
  • 指標
  • 數和指標的關係
  • 常見的儲存方式
  • 陣列替代品

 

 

 

 

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