1. 程式人生 > >《C++primer plus》閱讀筆記(2018-10-25)

《C++primer plus》閱讀筆記(2018-10-25)

    字串是以空字元為結尾的一系列字元。   字串可用引號括起的字元常量表示,其中隱式包含了結尾的空字元。  可以將字串儲存在char陣列中,可以用被初始化為指向字串的char指標表示字串。

  資料物件: 就是為資料項分配的記憶體塊。

strcmp(str1,str2)  如果str1 比 str2 小 那麼返回一個小於零的數;  如果str1 比 str2 大 那麼返回一個大於零的數; 如果 str1 等於 str2 那麼 返回零值。

比較string類型別的字串   :

     string類物件不使用空字元來標記字串末尾。

   類型別名: 

    C++為型別建立別名的方式有兩種:

   (1) 使用前處理器:  

         #define BYTE char // preprocessor replaces (前處理器 替代)

     這樣之後,前處理器將在編譯程式時,用char替換所有的BYTE, 從而使得 BYTE 稱為char的別名。

(2) 使用關鍵字typedef 來建立別名

  typedef char byte;   //makes byte an alias(alias - 別名) for char 

     通用格式:  typedef  typeName  aliasName; 

    也就是說要將aliasName作為某種型別的別名,可以宣告aliasName,如同將aliasName宣告為這種型別的變數那樣,然後在宣告之前加上關鍵字typedef。

 在使用前處理器建立別名時  需要注意一點   前處理器的副作用:

   例子 :  #d:efine FLOAT_POINTER float *;

 FLOAT_POINTER pa,pb;

就會被轉換成 下列的樣子:   float * pa,pb;從而導致編譯出錯。   而使用typedef 就不會有這樣的副作用。 (typedef能夠處理更復雜的類型別名。)

 注意:typedef不會建立新的型別,只是為已有的型別建立一個別名  僅此而已。

使用原始的cin進行輸入:

 那麼如何知道何時停止讀取呢? 如何知道這一點呢? 一種方法是選擇某個特殊字元——有時被稱為哨兵字元(sentinel character),將其作為停止標記。   通常,這種任務由作業系統處理。

  檢測到EOF後,cin將兩位(eofbit 和 failbit)都設定為1。 可以通過成員函式eof()來檢視eofbit是否被設定;  如果檢測到EOF,則cin.eof()將返回bool值true,否則返回false。 同樣,如果eofbit 或者 failbit被設定為1,則fail()成員函式返回true,否則返回false。 注意 eof() 和 fail() 方法是報告最近讀取的結果;也就是說,他們在事後報告,而不是預先報告。

理解二維陣列:

 假設聲明瞭一個這樣的陣列: 

      int maxtemps[4][5];

該宣告意味著maxtemps是一個包含4個元素的陣列,其中每個元素都是一個由五個整陣列成的陣列。

  如果把二維陣列放成一列 那麼 就類似於{{1,2,3},{1,2,3}} 對於陣列如果 印象不深刻 或者有些不懂的  自己 嘗試花花  一維陣列  二維陣列 三維陣列的  圖  就基本上好了 可以理解  大概是個宣告形狀   怎麼尋找陣列中的數的位置,  哪個數字 代表哪一維   都可以清楚的知道了。  (畫圖  畫圖  很重要  牛逼的 可以  腦補)

nested(巢狀的,內裝的)

有個 比較繞的點(關於 cin.get()函式使用的問題):

   cin.get(ch)  這個函式呼叫;  讀取輸入中的下一個字元,而不管該字元是什麼,並將其儲存到ch中, 成員函式呼叫cin.get()返回下一個輸入字元——包括空格、換行符和製表符,因此,可以這樣使用它:

  ch = cin.get();  (感覺和上面的 呼叫是一樣的效果,因為都把 下一個 輸入的字元  賦值給了 ch   雖然實現的機制可能不同,但是最後的結果 是一樣的)

  cin.get(char) 成員函式呼叫通過返回轉換為false的bool值來指出 已到達 EOF , 而 cin.get() 成員函式會返回EOF值來指出已到達 EOF 。 (EOF  是在iostream中定義的。)

 有個比較好玩的庫: (字元函式庫 cctype)————這個居然是C++從C繼承過來的  ,  學C的時候 沒有接觸過

   這個庫可以簡化諸如確定字元是否為大寫字母、數字、標點符號等工作。  

   這個庫使用 isalpha()來檢查字元是否為字母字元,使用isdigits()來測試字元是否為數字字元 

             使用isspace()來測試字元是否為空白,如換行符、空格和製表符。

cctype中的字元函式:

isalnum(); 如果引數是字母數字,即字母或數字,該函式返回true

isalpha();如果引數是字母,該函式返回true;

isblank();如果引數是空格或水平製表符,該函式返回true;

iscntrl();如果引數是控制字元(基本上可以理解成 某些特殊字元),該函式返回true;

isdigit();如果引數是數字(0 9),該函式返回true;

isgraph();如果引數是除空格之外的列印字元,該函式返回true;

islower();如果引數是小寫字母,該函式返回true;

isprintf();如果引數是列印字元(包括空格),返回true;

ispunct();如果引數是標點符號,該函式返回true;

isspace();如果引數是標準空白字元,如空格、進紙、換行符、回車、水平製表符或者垂直製表符,該函式返回true;

isupper();如果引數是大寫字母,該函式返回true;

isxdigit();如果引數是十六進位制的數字,即0 9 a f 或A F ,該函式返回true;

tolower(); 如果引數是大寫字元,則返回其小寫,否則返回該引數

toupper(); 如果引數是小寫字元,則返回其大寫,否則返回該引數

C++中寫入到文字檔案中:

   對於檔案輸入,C++使用類似於cout的東西。

(1)必須包含標頭檔案iostream;

(2)標頭檔案iostream定義了一個用處理輸出的ostream類

(3)標頭檔案iostream聲明瞭一個名為cout的ostream變數(物件)

(4)必須指明名稱空間std; 

(5)可以結合使用cout和操作符>>來顯示各種型別的資料

  檔案輸出與此及其相似

(1)必須包含標頭檔案fstream。

(2)標頭檔案fstream定義了一個用於處理輸出的ofstream類

(3)需要宣告一個或多個ofstream變數(物件),並以自己喜歡的方式對其命名,條件是遵守常用的命名規則

(4)必須指明名稱空間std;

(5)需要將ofstream物件與檔案關聯起來。為此,方法之一是使用open()函式的方法

(6)使用完檔案後需要用close()來關閉

(7)可結合使用ofstream物件和操作符>>來輸出各種型別的資料。