Primer 前五章雜記

2020-08-12 23:20:28

操作系統通過呼叫main來執行C++程式
內建型別 如int(也是型別說明符)
識別符號:變數或者物件名
宣告符:* or & 加上 型別修飾符(如const)
同類型的有符號與無符號運算,會強轉爲無符號
跳脫序列爲一個char

auto 對於參照型別的推斷會忽略參照 直接推斷被參照型別

在指針中修飾常數的const是底層const,修飾指針的const是頂層const
自身不變是頂層const,指向不變是底層const
陣列會在需要的時候自動轉化爲指向陣列首地址的指針
auto在自動推斷的時候去掉能去掉的物件

標頭檔案前用#pragma once 標頭檔案預處理 一次即可

auto參照 auto &   auto頂層const  const auto

單行註釋優先於界定符對形式的註釋
修正後立即重新編譯「編輯-編譯-偵錯(edit - compile - debug)」週期
形如20的值被稱爲字面值常數(literal)
變數名前新增extern,只宣告而不定義;若新增extern的同時賦初始值,則爲定義
void* 指針可用於存放任意物件的地址,void* 指針不能直接操作所指的物件
面對一條比較複雜的指針或參照的宣告語句時,從右向左閱讀有助於弄清楚它的真實含義如const限定
因爲非常數具有可讀可寫的功能,常數只有可讀的功能;
當常數參照非常數時,常數只期望可以讀數據,非常數不僅提供了讀數據,
而且非常數還可以寫數據(修改),因此常數參照非常數可以滿足常數的需求,可以通過;
返過來,常數不能夠滿足非常數的需求,所以不能通過。)
SetConsoleTitle() 函數爲bool型別,直接用std::cout會輸出0/1
decltype參照型別爲左值型別(若i是int, decltype(i=x)型別爲int& )
string型別初始化有拷貝初始化(string s1=」value」)和直接初始化(string s2(「value」))兩種

cctype標頭檔案的函數
|isalnum()| 如果參數是字母數位,即字母或數位,該函數返回true
|isalpha()| 如果參數是字母,該函數返回true
|isblank()| 如果參數是空格或水平製表符,該函數返回true
|iscntrl()| 如果參數是控制字元,該函數返回true
|isdigit()| 如果參數是數位(0~9),該函數返回true
|isgraph()| 如果參數是除空格之外的列印字元,該函數返回true
|islower()| 如果參數是小寫字母,該函數返回true
|isprint()| 如果參數是列印字元(包括空格),該函數返回true
|ispunct()| 如果參數是標點符號,該函數返回true
|isspace()| 如果參數是標準空白字元,如空格、進紙、換行符、回車、水平製表符或者垂直製表符,該函數|返回true
|isupper()| 如果參數是大寫字母,該函數返回true
|isxdigit()| 如果參數是十六進制的數位,即0~9、af、AF,該函數返回true
|tolower()| 如果參數是大寫字元,則返回其小寫,否則返回該參數
|toupper()| 如果參數是小寫字母,則返回其大寫,否則返回該參數
|tolower()——toupper()| 大寫轉爲小寫——小寫轉爲大寫
|isupper()——islower()| 判斷是否爲大寫——判斷是否爲小寫,若是返回true,否則返回該參數
|isalnum()——isalpha()| 判斷是否爲字母或數位,若是返回true,否則返回該參數——判斷是否爲字母,若是大寫字母返回1,若是小寫字母返回2,若不是字母返回0


範圍for回圈的參照爲字元型別
要使用size_type,需首先指定它是由哪種型別定義的。vector物件的型別總是包含着元素的型別。如vector<int>::size_type
關係運算符依照字典順序進行比較;只有當元素的值可比較時,vector物件才能 纔能被比較。
C++vector 不能用下標形式新增元素

C風格 字串
strlen§ length不計算空字元
strcmp(p1,p2) compare比較p1,p2相等性,相等返回0,前者大返回正值,後者大返回負值
strcat(p1,p2) 將p2附加到p1之後,返回p1(即爲把p2賦給p1,然後得到新的p1)
strcpy(p1,p2) 將p2拷貝給p1,返回p1

傳入此類函數的指針必須指向以空字元作爲結束的陣列
C++要相容C的標準庫,而C的標準庫裡碰巧也已經有一個名字叫做「string.h」的標頭檔案,包含一些常用的C字串處理常式,比如strcmp。
這個標頭檔案跟C++的string類半點關係也沒有,所以 並非 <string.h>的「升級版本」,他們是毫無關係的兩個標頭檔案。<string.h>是舊的C 標頭檔案,對應的是基於char*的字串處理常式; 是包裝了std 的C++標頭檔案,對應的是新的string 類: 是對應於舊C 標頭檔案的std 版本。

若字元陣列不手動輸入’\0’,則賦值的時候會一直讀取

c_str函數可作爲C/C++介面,返回C風格字串

可用陣列初始化vector,使用首尾迭代器:如 vector< int > iv(begin(),end())
多維陣列其實是陣列的陣列
用範圍for處理多維陣列,除了最內層的回圈外,其他所有回圈的控制變量都應該是參照型別

begin() 和 end() 函數定義在< iterator >中

參考書目 [1]C++ primer 第五版