第五章
1、for循環――for(initialization; test-expression; update-expression) body // test-expression 會被轉換為bool,0為false,非零為true
2、表達式――表達式是值或值與運算符的組合。賦值表達式的值為其左側成員的值,而賦值運算符是從右到左結合的。
3、a++和++a――
?。?)對于內置類型,兩種執行效率相同。
?。?)若重載運算符,對于類而言,前綴將值加1,返回結果;后綴會復制一個副本,加1后返回副本。所以前綴比后綴效率高。
4、逗號運算符――
(1)for循環中,將多個表達式合并為一個: i++, j++;
?。?)聲明: int i , j;
?。?)逗號表達式先計算第一個表達式,再計算第二個表達式。逗號表達式的值是第二部分的值。
?。?)逗號表達式是優先級最低的表達式。
5、strcmp()――比較兩個字符串。接受2個字符串地址A、B作為參數。AB相同返回0,A的字母順序在B之前,者返回負數,否則返回正數。
(用引號括起的字符串常量是其地址。)
6、clock()――返回程序開始執行后所用的系統時間。這個值除以CLOCKS_PER_SEC可以得到秒數。
7、類型別名――#define AA char // 用AA作為char的別名,所有的AA將被char替代
或 typedef AA char
8、cin――cin.get()會忽略空格和換行符。發送給cin的輸入會被緩沖。按下回車鍵,輸入的內容才會被發送給程序。
cin.get(ch)會得到每個字符。其參數聲明為引用類型,所以函數可以修改其參數的值。
9、EOF――很多PC編程環境都將Ctrl+Z視為模擬的EOF,檢測到EOF之后,cin將兩位(eofbit和failbit)都設置為1。eof()和fail()用來查看是否被設置。
所以循環等待輸入的條件可以這樣設置:while( cin.fail() == false ) {} 或 whle( !cin.fail() ){} 或 while(cin){} 或 while( cin.get(ch) ){}
?。ㄍǔ?,EOF被定義為-1)
第六章
10、運算符――!運算符的優先級高于所有的關系運算符和算術運算符。
邏輯AND運算符的優先級高于邏輯OR運算符。
C++確保程序從左到右計算邏輯表達式。
11、cctype――字符函數庫。如isalpha(ch)判斷字符是不是字母,是字母就返回非零,否則返回0。
12、文本IO――使用cin進行輸入時,程序將輸入看作一系列的字節,其中每個字節被解釋為字符編碼。
第七章
13、定義函數――
?。?)、無返回值: void functionName(parameterList) {}
?。?)、有返回值: typeName functionName(parameterList) {}
?。ㄗ⒁?!返回值的類型不能是數組,可以是其他任何類型)
14、函數原型――
?。?)、函數原型能極大降低程序出錯的幾率、提高效率。
(2)、函數原型不要求提供變量名,有類型列表就足夠了。
(3)、括號為空與括號中使用void是等效的,不指定參數列表應使用省略號――void haha(...);
15、函數和二維數組――指針的類型是指把指針聲明語句中的指針名字去掉所剩下的部分
對于: int data[3][4] = {{1,2,3,4},{5,6,7,8},{4,3,2,1}}; int total = sum(data,3); sum的原型是什么?
?。?)、原型是: int sum ( int (*a) [4] , int size);
所以 int(*)[4]即,將這個指針指向int[4]。所以data的類型指向由4個int組成的數組的指針
所以 int *a[4] 的類型是int * [4],這個指針指向int,總共有4個,即它是4個指向int指針組成的數組。
?。?)、函數定義: int sum (int a[][4] ,int size);
a[ r ][ c ] = *( *( a + r ) + c);
16、遞歸――每個遞歸調用都創建自己的一套變量。
(注意!C++不允許main()調用自己。)
17、函數指針――
?。?)、函數地址: 函數的地址是存儲其機器語言代碼的內存的開始地址。如果think()是一個函數,那么think就是它的地址。
?。?)、聲明指針函數: 函數:double pam(int); 指針函數為: double (*pf)(int) = pam; // pf是一個指向函數的指針。
第八章
18、編譯過程――編譯過程的最終產品是可執行程序(由一組機器語言指令組成)。
運行程序時,操作系統將這些指令載入到計算機內存中,因此每條指令都有特定的內存地址。計算機隨后逐步執行這些指令。
19、函數調用――執行到函數調用指令時,程序將在函數調用后,立即存儲該指令的內存地址,并將函數參數復制到堆棧,跳到標記函數起點的內存單元,
執行函數代碼(也許還需將返回值放入寄存器),然后跳回到地址被保存的指令處。
20、內聯函數――編譯器使用相應的函數代碼代替函數調用。
函數聲明前加上關鍵字inline,函數定義前加上關鍵字inline。通常將省略原型,原型處直接定義。
21、引用變量――主要用途是作函數的參數,函數將使用原始數據,而不是其副本。
(1)、創建: int rats ; int & a = rats;
?。?)、引用必須在聲明時初始化,不能先聲明再初始化。也不能通過賦值來設置引用。
?。?)、引用一旦與某個變量關聯起來,就一直效忠。
?。?)、若引用參數是const,若實參類型正確卻不是左值 或 類型不正確卻可以轉換成正確類型 時,將創建臨時變量。
?。?)、返回引用時,應避免返回函數終止時不再存在的內存單元引用。
22、左值――
(1)、可被引用的數據對象。如變量、數組元素、結構成員、引用和解除引用的指針等。
(2)、非左值,包括字面常量和包含多項的表達式。
(3)、常規變量屬于可修改的左值,const變量屬于不可修改的左值。
23、右值引用――可指向右值的引用,使用&&聲明。如: double & rref = std::sqrt ( 26.00 ) ;
24、默認參數――通過函數原型設置函數參數默認值。
?。?)、必須從右到左添加默認值。
(2)、實參按照從左到右的順序依次被賦值給形參,而不能跳過任何參數。
25、函數重載――參數列表(特征標)不同,而函數名相同的函數。
(1)、類型引用和類型本身被視為同一個特征標。
?。?)、不能把const變量賦值給非const形參
26、名稱修飾――根據函數原型中指定的形參類型對每個函數名進行加密,用來跟蹤每一個重載函數。
27、函數模板――相當于Java中的泛型
?。?)、聲明: template <typename T> void Swap(T &a, T &b); // typeName 可用 class 替換
(2)、函數模板不能縮短可執行程序,最終的代碼不包含任何模板,只包含了為程序生成的實際函數。
?。?)、一般將模板放在頭文件中。
28、顯式具體化――具體化的函數定義,匹配時,使用它而不是模板。
?。?)、非模板函數: void swap( job &, job &);
(2)、模板函數: template <typeName T> void swap( T & ,T &);
?。?)、顯式具體化: template<> void swap<job>( job &, job &); // swap<job>中job是可選的
(4)、編譯器在選擇原型時: 非模板函數 > 顯式具體化 > 模板函數
(5)、顯式實例化: template void swap<int> ( int, int); // template后無<>
(6)、隱式實例化: 對于模板函數,編譯器會通過對這個模板含數的引用生成一個含數的實例,這通常叫隱式實例化
29、decltype――decltype( expression ) var; // 讓var的類型與expression一樣。
?。ㄗ⒁猓∪鬳xpression是一個函數調用,var的類型與其返回值相同。若expression是一個左值,var為指向其類型的引用)
30、后置返回類型――給函數指定返回類型。
如:template<class T1, class T2> auto gt( T1 x, T2 y) -> decltype( x + y ) { ... return x + y ;}
新聞熱點
疑難解答
圖片精選