關於new
系統爲每個程序都提供了一個在程序執行時可用的內存池 這個可用內存池被稱爲程序的空閒存儲區[free store]或堆[heap]
類型指示符可以是內置類型或用戶定義類型 new 表達式返回指向新分配的對象的指針, 例如
int *pi = new int;
如果一個對象被用作一組位或位域的離散集合 那麼這樣的對象稱爲位向量 [bitvector ] 。位向量是一種用來記錄一組項目或條件的是/否信息 有時也稱爲標誌 [flag] 的緊縮方法。
例如 在編譯器中 類型聲明的限定修飾符[qualifier],如const 和volatile 有時就被存儲在位向量中 iostream 庫用位向量表示格式狀態
void*型指針
任何非const 數據類型的指針都可以被賦值給void*型的指針。void*型指針被用於”對象的確切類型未知“或者“在特定環境下對象的類型會發生變化”的情況。有時void*型的指針被稱爲泛型[generic]指針,因爲它可以指向任意數據類型的指針。
int ival;
int *pi = 0;
char *pc = 0;
void *pv;
pv = pi; // ok: 隱式轉換
pv = pc; // ok: 隱式轉換
const int *pci = &ival;
pv = pci;// 錯誤 : pv不是一個 const void*.
const void *pcv = pci; // ok
關於類型轉換
執行顯式強制轉換的第二個原因是希望改變通常的標準轉換。例如,下列複合賦值首先將ival 提升成double 型,然後再把它加到dval 上,最後把結果截取成int 型來執行賦值
double dval;
int ival;
ival += dval;
我們通過顯式地將dval 強制轉換成int 型 消除了把ival 從int 型到double 型的不必要提升 ival += static_cast< int >( dval );
形式如下
cast-name< type >( expression );
這裏的cast-name 是static_cast , const_cast, dynamic_cast 和reinterpret_cast 之一
const_cast 正如其名字所暗示的 將轉換掉表達式的常量性 以及volatile 對象的volatile性 神馬東西?
例如
extern char *string_copy( char* );
const char *pc_str;
char *pc = string_copy( const_cast< char* >( pc_str ));
試圖用其他三種形式來轉換掉常量性會引起編譯錯誤 類似地 用const_cast 來執行類型轉換 也會引起編譯錯誤
編譯器隱式執行的任何類型轉換都可以由static_cast 顯式完成
double d = 97.0;
char ch = static_cast< char >( d );
舊式強制類型轉換
前面給出的強制轉換符號語法 有時被稱爲新式強制轉換符號建議,只有當我們爲C 語言或標準C++之前的編譯器編寫代碼時才使用這種語法
舊式強制轉換符號有下列兩種形式
// C++強制轉換符號
type (expr);
// C語言強制轉換符號
(type) expr;
舊式強制轉換可以用來代替標準C++中的static_cast , cons_cast或reinterpret_cast在標準C++之前 我們只能使用舊式強制轉換 如果我們希望自己的代碼在C++和C 語言中都能夠編譯的話,那麼只能使用C 語言的強制轉換符號空語句
程序語句最簡單的形式是空語句 形式如下 僅一個分號
; // 空語句
空語句被用在 程序的語法上要求一條語句,而邏輯上卻不需要的時候。例如,在下面的while 循環中,把一個C 風格字符串拷貝到另一個字符串中去所需的全部處理過程。在這個語句的被稱爲條件[condition] 的部分就已經完成了,但是 while 循環的格式要求條件。
後面跟一條語句 因爲不需要再做其他的工作 所以我們用一條空語句來滿足這個語法要求
while ( *string++ = *inBuf++ )
; // 空語句
意外出現的多餘空語句不會產生編譯錯誤 例如 下面的語句
ival = dval +sval;; // ok: 多餘的空語句
複合語句
由一對花括號括起來的語句序列 複合語句被視爲一個獨立的單元 它可以出現在程序中任何單個語句可以出現的地方 複合語句不需要用分號作爲結束 這是一種附加的語法上的便利 。 空複合語句與空語句等價,它爲空語句提供了一種替代語法。例如
while ( *string++ = *inBuf++ )
{ } // 等價於空語句
if 語句
C++語言提供if 語句的動機是 根據指定的表達式是否爲true ,有條件地執行一條語句或語句塊。if 語句的語法形式如下
if ( condition )
statement
condition 條件 必須被放在括號內 它可以是表達式 如
if ( a + b > c ) { ... }
或是一條具有初始化功能的聲明語句 如 此條在as3中是不成立的 if ( int ival = compute_value() ) { ... }
空懸else[dangling-else]問題
if ( minVal <= ivec[ i ] )
if ( minVal == ivec[ i ] )
++occurs;
else {
minVal = ivec[ i ];
occurs = 1;
}
程序的縮進形式表明程序員相信else 應該與最外面的if 子句匹配,然而在C++中,空懸else 二義性由以下規定來解決:else 子句與最後出現的未被匹配的if 子句 相匹配。在本例中 if-else 語句實際的計算過程如下 if ( minVal <= ivec[ i ] ) {
// 空懸 else的解釋結果
if ( minVal == ivec[ i ] )
++occurs;
else { minVal = ivec[ i ]; occurs = 1; }