標籤:
1 const對象預設為檔案的局部變數(P50)
a.cppconst int a = 1;b.cppextern int a;//undefined reference to "a"a.cppint a = 1;b.cppextern int a;//OKa.cppextern const int a = 1;b.cppextern int a;//OK
即非const變數預設為extern,const變數要在其他檔案中被訪問,必須顯式指定為extern
2 const與引用(P51)
非const引用綁定到const對象是不合法的,const引用可以綁定到const對象和非const對象
const引用還可以綁定到不同但相關的類型的對象,或是綁定到右值
3 枚舉定義了相關聯的一組常量集,enum定義了一種新的類型
4 字串字面值不是string對象
getline(cin,string)函數讀取一行,但將忽略最後的分行符號
string對象的size()操作返回的是string::size_type類型的值,稱為string類類型的配套類型,使得該類型的使用與機器無關
+操作符的左右運算元必須至少有一個是string類型的對象
string對象的下標操作可以用作左值
字元的操作函數如isalnum()、isalpha()、tolower()等函數都定義在cctype標頭檔中(C++標準庫包括了C標準庫,C標準庫中name.h在C++標準庫中對應為cname)
5 vector相關問題
c++程式員優先使用!=而不是<來編寫迴圈判斷條件,由於vector的動態增長特性,在迴圈判斷中,使用內嵌函式size,而不是迴圈之前得到的固定vector大小的值,因為vector會動態增長,內嵌函式會解決運行時的代價問題
vector可以進行=賦值 如vector<int> a(2,3) vector<int> b(3,4),可以進行a=b的賦值
const_iterator只能用於從容器中讀取元素,不能修改元素的值,const vector<T>::iterator 迭代器本身不能移動,但可以修改迭代器指向的元素的值
6 bitset相關問題
建構函式:bitset<n> b;
bitset<n> b(u); //u是unsigned long類型
bitset<n> b(s); //s是string類型對象,不能是字串字面值
bitset<n> b(s,pos,n) //需要注意的是,字串的0下標在左側,bitset的0下標在右側
bitset對象上的操作:
b.any() //是否存在1
b.none() //是否不存在1
b.count() //1的個數
b.size() //二進位的個數
b.test(pos) //測試pos處是否為1
b.set(),b.set(pod),b.reset(),b.reset(pos)
b.flip() //所有位反轉
b.flip(pos) //pos位反轉
b.to_ulong() //返回unsigned long值
os<<b //輸出位集
7 數組和指標
定義數組維數的常量只能是:整型字面值常量、枚舉常量、整型const對象,不能是非const整型對象
char a[] = "c++" 與 char a[] = {‘c‘,‘+‘,‘+‘}的區別,char a[3] = "c++"將導致編譯失敗
與vector不同的是,數組不能直接複製與賦值
數組下標的正確類型是size_t,指標相減的正確類型是ptrdiff_t類型
int* p1,p2 //p1是指標,p2是int
void *指標只能用來傳遞指標,不能解引用,即不能通過void *指標操縱它所指向的對象
指標和引用的比較:引用定義時必須初始化,一旦初始化,引用就始終指向初始化的對象,所以不存在對引用的重新賦值
理解代碼:定義了一個4*5的int數組
int **p;p = new int*[4];for(int i = 0;i < 4;++i) p[i] = new int[5];
指向const對象的指標:const int *ptr,ptr既可以指向const對象,也可以指向非const對象,ptr本身值可變,不能通過ptr修改指向對象的值
const指標:int *const ptr,ptr本身是const變數
C風格字串:以NULL結尾的字元數組
C風格字串的標準庫函數:cstring,包括strlen、strcmp、strcat、strcpy、strncat、strncpy等函數,這些函數的參數必須是C風格字串
指標與多維陣列:int *p[4]:p是一個數組,這個數組每個元素的類型是int*
int (*p)[4]:p是一個指標,這個指標指向一個指向4元素首地址的指標
8 位操作符
~位求反,<<左移,>>右移,位與&,位或|,位異或^
9 後自增操作符優先順序高於解引用操作符
10 new和delete相關問題
new動態建立對象,如果沒有顯式初始化,則類類型對象使用預設建構函式進行初始化,內建類型對象無初始化,可以使用空括弧強制內建類型初始化
理解代碼:delete p1刪除的是new分配給p2的動態空間,p1和p2指標本身還可用,之前分配給p1的空間仍有效
int *p1 = new int(1);int *p2 = new int(2);p1 = p2;delete p1;
type *ptr = 0 定義了一個零值指標,delete ptr是合法的
delete之後,指向delete刪除的空間的指標編程懸垂指標,為避免懸垂指標的影響,delete之後立刻將指標賦值為0,表明指標不再指向任何對象
11 類型轉換
隱式轉換:指向任意資料類型的指標轉換為void*類型,整型數值常量0轉換為任意指標類型
顯式轉換(強制類型轉換):cast_name<type>(expression),將expression依據cast_name轉換為type類型
dynamic_cast:支援運行時識別指標或引用所指向的對象
const_cast:將轉換掉運算式的const性質
static_cast:
reinterpret_cast:
c++primer複習(一)