《C++ Primer》讀書筆記(4.9,4.11,4.14,5.1,5.3)

關於new   

 系統爲每個程序都提供了一個在程序執行時可用的內存池 這個可用內存池被稱爲程序的空閒存儲區[free store]或[heap] 

類型指示符可以是內置類型或用戶定義類型 new 表達式返回指向新分配的對象的指針,    例如 

        int *pi = new int; 


位向量
如果一個對象被用作一組位或位域的離散集合 那麼這樣的對象稱爲位向量 [bitvector ] 。位向量是一種用來記錄一組項目或條件的是/否信息 有時也稱爲標誌 [flag]  的緊縮方法。
例如 在編譯器中 類型聲明的限定修飾符[qualifier],如constvolatile 有時就被存儲在位向量中 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-namestatic_cast  , const_cast dynamic_castreinterpret_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_castreinterpret_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; } 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章