C++ Primer Plus 筆記第四章

 

數組:

  初始化: typeName  arrayName[arraySize];  arraySize 必須是整型常量或者const值;ios

  必須是特定類型的數組: int數組、char數組、float數組;數組

  只對數組一部分進行初始化,編譯器把其餘元素設置爲0;安全

  C++標準模板庫(STL)一種數組替代品----模板類vector函數

字符串:

  char數組存儲字符串以空字符 '\0' 結尾;工具

  char dog[5] = {'b'. 'e'. 'a'. 'u'. 'x'};  // not a string!spa

  char cat [5] = {'f'. 'a'. 't'. 's'. '\0'};   // a string!設計

  字符串常量初始化:指針

    char bird[10] = "Mr. Cheeps";  // the \0 is understoodcode

    char fish[] = "Bubbles";      // let the compiler count對象

     注意: 字符串常量(使用雙引號)不能與字符常量(使用單引號)互換。

    在ASCII系統上,'S'只是83的另外一種寫法;

     "S"表示的是兩個字符(S和\0字符)

   標準頭文件 cstring 提供了標準庫函數 strlen() 計算字符串長度;

   cin使用空白(空格、製表符和換行符)來定字符串的界,所以只能讀取一個單詞;

面向行的輸入: getline():

   cin.getline (name, 20);

   第一個參數用來存儲輸入行的數組的名稱,第二個參數是要讀取的字符數;

   經過回車輸入的換行符來肯定輸入結尾

面向行輸入:get():

   第一種:cin.get (name, ArSize); 參數解釋與cin.getline() 相同,可是不能跨越換行符!!!

   第二種:cin.get() 能夠讀取下一個字符;

    cin.get (name, ArSize);                         

    cin.get ();        等效於   cin.getline (name, ArSize);       

    cin.get (dessert, ArSize);        cin.getline (dessert, ArSize);    等效於    cin.getline (name, ArSize).getline (dessert, ArSize);

     iostream類的成員函數get() 函數常常應用於cin.get (name, ArSize) .get()  

string類簡介:

   string類型的變量---對象, 頭文件爲string,string類位於名稱空間std中;

   類的設計能讓程序自動處理string的大小,能夠避免char數組存儲容不下等問題;

   相比於char數組存放字符串:

    string對象能夠對象間賦值;                    str1 = str2

    可使用 '+' 將兩個string對象合併;       str3 = str1 + str2

    可使用 '+=' 實現string對象拼接       str1 += str2 

    str.size():

    size() 是類string的一個類方法(即成員函數), 成員函數只能經過所屬類的對象進行調用;

    str1.size() 肯定對象str1中字符數;                     頭文件string            // string類頭文件

    strlen(charr1) 肯定char數組charr1中字符數;    頭文件cstring          // C-style string library

     getline(cin, str):

    這裏的 getline() 不是類的方法(cin.getline() 由對象調用的纔是類的方法);

    cin做爲參數指出到哪裏去找輸入

結構簡介:

   結構的聲明與初始化:

struct inflatable           inflatable gust =         {                 {        char name[20];           "Glorious Gloria",        float volume;            1.88,        double price;            29.99       };                };

   C++不提倡使用外部變量,但提倡使用外部結構聲明(全部函數能夠用這種類型的結構)。

    結構能夠做爲參數傳遞給函數,可讓函數返回一個結構,能夠用操做符 '=' 將結構賦給另外一個同類型的結構

    結構數組:

    能夠建立元素爲結構的數組:  inflatable gifts[100];

    其中 gifts 是數組、gifts[0] ~ gifts[99] 是結構,存在gifts[0] .name、gifts[0] .volune、gifts[0] .price;

共用體:

   共用體句法與結構類似,可是公用體只能同時存儲一種數據類型   

    用途之一: 當數據項使用兩種或更多格式(但不會同時使用)時,能夠節省空間;

枚舉:

  能夠代替const,另外一種建立符號常量的方式 enum工具;

   enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};

   spectrum 爲新類型名稱,將red、orange、 yellow等做爲符號常量0~7,成爲枚舉量;

   在不進行強制類型轉換的狀況下,只能將定義時使用的枚舉量賦值給枚舉變量:

    spectrum band;    // 聲明枚舉變量

    band = blue;         // valid,將枚舉量blue賦給band

    band  = 2000;          // invalid,2000不是枚舉量

    枚舉量是整型,可被提高爲int類型,但int 不能被自動轉換爲枚舉類型

指針和自由存儲空間:

   計算機在存儲數據時要跟蹤的三個基本屬性:

     信息存儲在何處、存儲的值爲多少、存儲的信息是什麼類型;

     策略:

      1. int a = 1;聲明語句指出了值的類型和符號名,程序爲值分配內存,並在內部跟蹤該內存單元;

      2. 將地址設爲指定的量,將值設爲派生量,指針---用於存儲值的地址,' *  ' 號操做符被稱爲間接值或解除引用

        假設manly表示的是一個地址,而*manly表示存儲在該地址處的值。這裏的*manly至關於int變量a

   在C++ 中 int* 是一種複合類型,是指向 int 的指針;

    int higgens = 5;  

     int *pt = &higgens;     // 將 pt (而不是 *pt)的值設置爲&higgens, 而*pt = 5

   指針與數組同樣是基於其它類型的,咱們應說指向double的指針(double*)、指向char的指針(char*)、指向int類型的指針(int*)

指針的危險:

  典型的危險:

     long * fellow;            // 聲明long指針,未初始化

     * fellow  = 223323;     // 數據被一個未初始化地址的指針指向

   指針使用的金科玉律:

     必定要在對指針應用解除引用操做符(*)以前,將指針初始化爲一個肯定的、適當的地址。

指針和數字:

   指針不是整型,要將數字值做爲地址來使用賦值給指向 int 的指針(int*),應經過強制類型轉換

  int *pt;

    pt = ( int* ) 0xB8000000;      // 不能直接 pt = 0xB8000000;      

 

使用 new 來分配內存:

  int * pn = new int, 通用格式: typeName pointer_name = new typeName;

   pn指向的內存沒有名稱,使用 *pn 操做 pn 指向的數據對象;

   計算機沒有足夠內存時, new 返回0,C++中值爲0的指針被稱爲空指針。若是成功,new 返回一個有用的指針;

使用 delete 來釋放內存:   

 int *ps = new int// 使用 new 得到內存; . . .         // 使用內存;
 delete ps;           // 使用 delete 釋放內存

   釋放 ps 指向的內存,但不會刪除 ps 自己;

   配對的使用 new 和 delete,防止內存的泄露;

    C++ 指出不要嘗試釋放已經釋放的內存塊;

    對空指針使用 delete 是安全的;

使用 new 建立動態數組:

  靜態聯編: 經過聲明來建立數組,在程序被編譯時將爲它分配內存空間;

   動態聯編: 數組在程序運行時建立並肯定數組的長度;

   使用 new 建立一個包含10個 int 元素的動態數組, 在類型名後加上方括號,其中包含元素數目:

     int * psome = new int [10];

     new 操做符返回第一個元素的地址;

     使用 new 建立的數組,應使用 "delete [ ] psome" 釋放一個數組

    new 和 delete 使用時,應遵照規則:

     1. 不用使用 delete 來釋放不是 new 分配的內存;

     2. 不要使用 delete 釋放同一個內存塊兩次;

     3. 使用 new [ ] 爲數組分配內存,則應使用 delete [ ] 來釋放;

     4. 使用 new [ ] 爲一個實體分配內存,則應使用 delete (沒有方括號)來釋放;

      5. 對空值指針應用 delete 是安全的

使用動態數組:

  C和C++內部都是使用指針來處理數組數組與指針基本等價是C和C++的優勢之一;

   int * psome = new int [10] :

     *psome 是第一個元素的值;

     psome[0] 爲第一個元素、psome[1] 爲第二個,依次類推----把指針當作數組名便可

   指針與數組的不一樣之處:

    數組名的值是不能修改的,但指針是變量,能夠修改;

    psome = psome + 1 將使得表達式 psome[0] 指向數組的第二個值

指針小結:

  (1)聲明指針

    typeName * pointerName;  聲明指向特定類型的指針

  (2)給指針賦值

    能夠對變量名應用 '&' 操做符來得到被命名內存的地址,new 操做符返回未命名內存的地址

  double * pn;             // 定義指向double類型的指針pn;   double * pa;             // 定義指向double類型的指針pa;   char * pc;              // 定義指向char類型的指針pc;   double bubble = 3.2;           pn = &bubble;            // 把bubble的地址給指針pn;   pc = new char;            // 分配指向新的指向char地址的內存給pc;   pa = new double[30];        // 分配元素爲30的double數組地址給pa;

 

  (3)解除指針引用

    1. 對指針應用解除引用或間接值操做符 (*) 來解除引用: *pn = 3.2;

    2. 數組表示法: pn[0] 與 *pn 是同樣的

    注意: 毫不要對未初始化爲適當地址的指針解除引用

  (4)數組名

    C++將數組名視爲數組的第一個元素的地址:

      int tacos[10];  // 此時 tacos 等同於 &tacos[0] 

    sizeof 操做符用於數組名時,返回整個數組的長度(單位爲字節)

  (5)指針算數

    C++容許將指針和整數相加,加1的結果等於原來的地址值加上指向的對象佔用的總字節數;

    兩個指針指向同一個數組時,能夠將一個指針指向另外一個指針,獲得兩個元素的間隔

  (6)數組的動態聯編和靜態聯編

    使用數組聲明來建立數組時,將採用靜態聯編,即數組的長度在編譯時設置:

      int tacos[10] ;

    使用 new[ ] 操做符建立數組時,將採用動態聯編,即在運行時爲數組分配空間。 使用這種數組後,應使用delete [ ] 釋放佔用的內存:

 

       int * pz = new int [size];

       .  .  . 

       delete [ ] pz;

  (7)數組表示法和指針表示法

    使用方括號的數組表示法等同於對指針解除引用;

      tacos      等同於  *tacos

      tacos[3]  等同於  *(tacos + 3)   

    使用數組表示法時,C++執行轉換:

      arrayName[i]     轉換  *(arrayName + i);

    使用指針表示法時,C++執行轉換:

      pointerName[i]  轉換  *(pointerName + i) 

 指針和字符串:

  在cout和多數C++表達式中,char數組名指向char的指針以及用雙引號括起來的字符串常量都被解釋爲字符串第一個字符的地址:

     char flower[10] = "rose";     // 聲明指向char的數組,並賦初值

     cout << flower << "s are red\n"; // 輸出 roses are red  數組名flower和字符串常量"s are red\n"都被解釋爲第一個字符地址

   將 animal 數組中的字符串複製到新分配的空間:

    ps = new char[strlen (animal) + 1];  // get new storage   "+1" 是由於字符串存儲有'\0'

    ps = animal;              // invalid 不會複製字符串,只複製地址,這樣兩個指針ps 和animal 將指向相同地址

    strcpy (ps, animal);   // valid copy string to new storage;經過使用strcpy() 和new 將得到兩個獨立的副本

   注意:應該使用strcpy() 或strncpy() ,而不是複製操做符來說字符串賦給數組

使用new建立動態結構:

  「動態」意味着內存在運行時而不是編譯時分配;

   將new用於結構有兩步組成:建立結構和訪問成員:

    建立:intflatable *ps = new inflatable;

    訪問:1. 指針用操做符(->) eg: ps->name   2. 結構名用句點操做符  eg: (*ps).price 

複合類型總結:

  數組、結構和指針是C++3種複合類型;

   數組能夠在一個數據對象中存儲多個同類型的值,經過使用索引或者下標能夠訪問數組中各個元素;

   結構能夠將多個不一樣類型的值存儲在同一個數據對象中,可使用成員關係操做符(.)來訪問其中的成員

     1. 建立模板,定義結構存儲了那些成員;

     2. 根據模板聲明相應類型的結構變量。

   共用體能夠存儲一個值,但這個值能夠是不一樣的類型,成員名指出了使用的模式;

   指針被設計是用來存儲地址的變量,指針聲明指出了指針指向的對象的類型,對指針使用解除引用操做符能夠得到值;

   字符串是以空字符結尾的一系列字符:

     字符串能夠用雙引號括起來的字符串常量表示,其中隱式的包含告終尾的空字符;

     能夠將字符串存儲在char 數組中;

     能夠用被初始化爲指向字符串的char指針表示字符串;

   函數strlen()返回字符串的長度,不包括空字符。函數strcpy()將字符串從一個位置複製到另外一個位置。頭文件cstring。

   new操做符容許程序在運行時爲數據對象請求內存。該操做符返回得到內存的地址,能夠將這個地址賦給一個指針:

     若是數據對象是簡單的變量,可使用解除引用操做符(*)來獲取真值;

     若是數據對象是數組,能夠像使用數組名那樣使用指針來訪問元素,ps[0]、ps[3];

     若是數據對象是結構,可使用指針解除引用操做符(->)來訪問成員。

   指針和數組關係緊密:

     ar[i] 被解釋爲  *( ar + i )數組名ar被解釋爲數組的第一個元素;

     一樣可使用數組表示法,經過指針來訪問new分配的數組中的元素。

   自動變量是在函數中聲明的變量,而靜態變量是在函數外部或者使用關鍵字 static聲明的變量

相關文章
相關標籤/搜索