[轉]C++重讀一:C++基本語言

0.       編譯C++程序時,編譯器自動定義了一個預處理名字__cplusplus,而編譯標準C時,自動定義名字__STDC__。另外幾個比較有用的預定義名字是__LINE__(文件的當前編譯行數),__FILE__(當前被編譯的文件名字),__DATE__(編譯日期)和__TIME__(編譯時間)。
1.       C庫頭文件的C++名字總是以字母C開頭,後面去掉後綴.h的C名字,如assert.h在C++庫中的名字是cassert。兩種使用方法:
#include <assert.h>或者
#include <cassert>
using namespace std;
2.       靜態與動態內存分配的兩個主要區別:(1)靜態對象是有名字的變量,可以直接進行操作,動態對象是沒有名字的變量,可以通過指針間接進行操作;(2)靜態對象的分配和釋放由編譯器自動處理,而動態對象必須由程序員顯式的管理,通過new和delete兩個表達式來完成。
3.       類的缺省構造函數是不需要用戶提供任何參數的構造函數。
4.       STL中標準數組-vector(文件vector),兩種遍歷方式:(1)通過下標操作符;(2)使用迭代器,如vector<int>::iterator iter;可以通過對iterator解引用來直接訪問實際的元素*iter;STL提供了作用於容器類型的泛型算法,頭文件algorithm。
5.       文字常量是不可尋址的。
6.       常用的幾個轉義序列:
newline(換行符) /n /14
horizontal tab(水平製表符
) /t
vertical tab(垂直製表符
) /v
backspace(退格符
) /b
carriage return(回車鍵
) /r
formfeed(進紙鍵
) /f
alert (bell)(響鈴符) /a /7
7.       變量和文字常量都有存儲區,區別在於變量是可尋址的,對於每個變量,都有兩個值與之關聯:數據值,稱爲對象的右值,是被讀取的值,文字常量和變量都可以用作右值;地址值,被稱爲變量的左值,是位置值,文字變量不用被用作左值。
8.       每個指針都有一個相關的類型。不同數據類型的指針之間的區別在於指針所指的對象的類型上。如果我們需要的僅僅是持有地址值,C++提供了一種特殊的指針類型:空(void *)類型指針,它可以被任何數據指針類型的地址值賦值,除了函數指針。不能操作空類型指針所指向的對象,只能傳送該地址值或將它與其他地址值做比較。
9.       C風格的算法循環:
while(*p++){…}
10.   正確定義引用,如下:
const int ival = 1024;
const int *&pi_ref = &ival; //
錯誤,pi_ref是一個引用,它指向定義爲const的int型對象的一個指針,引用不是指向常量,而是指向了一個非常量指針
const int *const &pi_ref = &ival; // OK
11.   指針和引用有兩個主要區別,引用必須總是指向一個變量;如果一個引用給另外一個引用賦值,那麼改變的是被引用對象而不是引用本身。
12.   布爾類型對象雖然也被看作整數類型的對象,但是它不能被聲明爲signed,unsigned,short或long。
13.   一個數組不能被另外一個數組初始化,也不能被賦值給另外一個數組,而且,C++不容許聲明一個引用數組。
14.   數組標誌符代表數組中的第一個元素的地址。它的類型是數組元素類型的指針。
int ia[10];
第一個元素的地址: ia或者是&ia[0]
第二個元素的地址: ia+1或者是&ia[1]
15.   STL中vector有兩種不同的使用形式:數組習慣,即使用下標操作符,注意只能操作已經存在的成員;STL習慣,使用iterator來操作,對其解引用可以訪問實際的對象,也可以通過加減來移動位置。
16.   typedef用來爲內置的或用戶定義的數據類型引入助記符號。
typedef char *cstring;
extern const cstring cstr;
其中cstr的類型是 char *const cstr;
17.   當一個對象的值可能會在編譯器的控制或監製之外被改變時,那麼該變量應該聲明爲volatile,編譯器執行的某些例行優化不能應用在已經指定爲volatile的對象上。
18.   pair類可以在單個對象內部把相同類型或不同類型的兩個值關聯起來。我們可以使用成員訪問符號來訪問pair中的單個元素,他們的名字爲first和second。
19.   在類體外定義的內聯成員函數,應該被包含在含有該類定義的頭文件中。
20.   setw()是一個預定義的iostream操作符,它讀入的字符數最多爲傳遞給它的參數減一。如setw(1024),則最多讀入1023個字符。
21.  標準C++頭文件limits提供了與內置類型表示有關的信息,另外,還有標準C頭文件climits和cfloat。
22.   對於二元操作符<或者>,左右操作數的計算順序在標準C和C++中是都是未定義的,因此計算過程必須是與順序無關的。如ia[index++]<ia[index]就是未定義的。
23.   初始化過程爲對象提供初值,而賦值是用一個新值覆蓋對象的當前值,一個對象只能被初始化一次,也就是在它被定義的時候,而賦值可以多次。如初始化int ival = 1024;賦值 ival = 1025;賦值操作符的左操作數必須是左值。
24.   sizeof操作符的作用是返回一個對象或者類型名的字節長度,返回值類型是size_t,這是一種與機器有關的typedef定義,可以在cstddef文件中找到它的定義。
25.   按位非操作符(~)翻轉操作數的每一位。移位操作符(<<和>>)將其左邊操作數的位向左或者向右移動某些位,移到外面的位被丟棄,左移操作符從右邊開始用0填充空位。右移操作符,如果是無符號數從左邊開始插入0,否則它或者插入符號位的拷貝或者插入0,這由具體實現定義。按位與(&)對兩個操作數的每一位進行與操作(只有兩位同時爲1時值才爲1)。按位異或(^)操作符對兩個操作數的每一位進行異或操作(只有兩個含有一個1時值才爲1,即兩位不同值爲1)。按位或(|)操作符對兩個操作數的每一爲進行或操作(只有兩位同時爲0時值才爲0)。如將整數a的第27位設爲1:a |= 1 << 27;將第27爲設爲0:a &= ~(1 << 27) ;測試第27位是否爲1:a & (1 << 27)。
26.   bitset類,頭文件爲<bitset>,支持三種構造方式,第一是直接指定向量長度,如bitset <32> bs;第二是顯式提供一個無符號參數,如bitset<32> bs(012);將第1和第3位設置爲1。第三是傳遞一個代表1和0集合的字符串參數,還可以標記字符串的範圍,如string bitval(“1111110101100011010101”);bitset<32> bs(bitval, 6, 4);則bs的第1和第5位被初始化爲1;如果去掉指定字符串範圍的第三個參數,則範圍是指定的位置開始一直到字符串的末尾。而函數to_string和to_ulong則把bitset對象轉換爲字符串和整型表示。
27.   操作符優先級表
28.   隱式轉換髮生在下列情況下:1.混合類型的算術表達式,即算術轉換;2.用一種類型的表達式賦值給另一種類型的對象;3.把一個表達式傳遞給一個函數調用,表達式的類型和形式參數的類型不相同;4.從一個函數返回一個表達式。
29.   算術轉換的兩個原則:1.如果必要的話,類型總是提升爲較寬的類型;2.所有含有小於整型的整值類型的算術表達式,在計算之前,其類型都會被轉換爲整型。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章