1.typedef
typedef用來定義同類型的同義詞。如:
1 typedef unsingned int size_t; 2 typedef int ptrdiff_t; 3 typedef T * iterator;
需要注意的是,不應該將typedef當做文本擴展來看待,如下例:
1 typedef string * pstring; 2 const pstrng cstr;
此時第二行中cstr應該表示什麼類型呢?若當做文本擴展,則會認為cstr表示const string *,即cstr是一個指針,指向一個const string對象。但是實際上,const修飾的是pstring類型,而pstring是一個string類型指針,則cstr應該表示的是一個指向string類型對象的const指針。
2.sizeof操作符
sizeof操作符的作用是返回一個對象或類型名的長度,返回值的類型為size_t,長度的單位為字節。
1 //sizeof 操作符的三種用法 2 sizeof(type name); 3 sizeof(expr); 4 sizeof expr; 5 //eg. 6 string ss,*sptr; 7 int i; 8 sizeof(ss); 9 sizeof(string); 10 sizeof *sptr; 11 sizeof(i); 12 sizeof (int);
可以用sizeof操作符求一個數組的元素個數,如下:
1 int a[10]; 2 int sz = sizeof(a)/sizeof(int);//sz == 10
3.顯示類型轉換(強制類型轉換)
命名的強制類型轉換符號一般形式如下:
1 cast-name<type>(expression);
a.dynamic_cast
dynamic_cast操作符將基類類型對象的引用或指針轉換為同一繼承層次中其他類型的引用或指針。
dynamic_cast與其他強制轉換的不同之處在於,dynamic_cast涉及運行時類型檢查。如果綁定到引用或指針的對象不是目標類型的對象,則dynamic_cast失敗。如果轉換到指針類型的dynamic_cast失敗,則dynamic_cast的結果為0值;如果轉換到引用類型的dynamic_cast失敗,則拋出一個bad_cast異常。看一個例子:
1 class Base{ 2 ... 3 }; 4 5 class Derived:public Base{ 6 ... 7 }; 8 9 //Base *baseptr = new Base; 10 Base *baseptr = new Derived; 11 if (Derived *derivedPtr = dynamic_cast<Derived *>(baseptr)){ 12 ... 13 }else{ 14 ... 15 }
如果baseptr實際指向Derived對象,則轉換成功;若baseptr指向Base對象,則轉換失敗。
b.const_cast
const_cast可以轉換掉表達式中的const性質。舉例如下:
1 void process(string *sptr); 2 const string *csptr; 3 process(const_cast<string *>(cspttr));
函數process接受string*參數,若傳給其一個const string *是不可以的,使用const_cast便可將const string*轉換為string*。
b.static_cast
編譯器隱式執行的任何類型准換都可由static_cast顯式完成。
1 double dval = 3.14; 2 char cval = static_cast<char>(dval);
還可用static_cast找回存放在void *指針中的值。
1 double dval = 3.14; 2 void * ptr = &dval; 3 double *dp = static_cast<double *>(ptr);
4.c++中的三種new
a.new表達式
new表達式動態創建對象,返回指向新創建對象的指針,該對象創建於自由存儲區。用new表達式創建的對象內存必須用delete表達式釋放,如果忘記釋放該對象,則就會造成內存洩露。當new表達式無法獲取所需內存空間時,系統將拋出bad_alloc異常。
1 int *pi = new int(10); 2 int *pj = new int; 3 string *ps = new string("1024"); 4 string *psj = new string;
當使用new表達式的時候,實際發生了三個步驟。首先,表達式調用operator new()操作符函數分配足夠大的未初始化內存,以保存指定類型的一個對象;接下來,運行該類型的一個構造函數,用指定初始化式在未初始化內存上構造對象;最後,返回指向新分配並構造的對象的指針。
b.operator new和operator delete
operator new用來獲得未初始化的內存,它類似於allocator類中的allocate成員函數;operator delete用來釋放內存,它類似於allocator類中的deallocate()成員函數。operator delete不會運行析構函數,因此在調用operator delete前應顯示調用析構函數清除對象本身。operator new與operator delete的原型如下:
1 void *operator new(size_t); 2 void *operator new[](size_t); 3 void *operator delete(void *); 4 void *operator delete[](void *); 5 6 //eg. 7 string *ps = static_cast<string *>(operator new(sizeof(string))); 8 int sz = 10; 9 int *pi = static_cast<int *>(operator new(sizeof(int)*sz)); 10 operator delete[](pi);
c.定位new(placement new)
定位new表達式在已分配的原始內存中初始化一個對象。它與operator new的不同之處在於它不分配內存額對象,相反,它接受指向已分配但未構造的內存的指針,並在該內存中初始化一個對象。這與allocator類中的construct成員函數類似。定位new表達式形式如下:
1 new (place_address) type; 2 new (place_address) type(initializer_list); 3 4 //eg. 5 string *ps = static_cast<string *>(operator new(sizeof(string))); 6 new (ps) string("hello world");