1. 程式人生 > >C++ primer 5th 第六章筆記

C++ primer 5th 第六章筆記

總結:

    6.1 基礎  :
        陣列 和 函式不能充當返回值, 可以使用指向他們的指標.
        自動變數: 生存週期 = 作用域
        區域性靜態變數: 生存週期 > 作用域
      	函式宣告 = 函式原型

     6.2 引數傳遞:
        值傳遞: 變數,指標,函式(傳值呼叫)
        引用傳遞 : 避免大量拷貝,const 修飾能擴大其型別容納範圍。
        
        形參的頂層const會被忽略掉.
        
        陣列當作引數會被退化成指標 [ 指向下一維度陣列指標]
            解決方式:
                  1.使用整數形參 說明其退化前的維度 
                  2.使用陣列引用方式傳遞, 但是就只能傳遞固定維度的陣列了
        
        可變引數列表:
            1.initializer_list :
                內部全是const, 且拷貝賦值共享元素.
            2.可變引數模板
            3.C介面的 ... , 此時應該使用C支援的資料型別當作實際引數.

     6.3 return : 
         使用返回值初始化一個臨時量。
         
         C++11規定可以返回 {}, 只要接受的資料能接受 [ 返回型別不能是陣列型別]
        
         返回指向陣列的指標的方式:[引用也適用]
         1.類型別名:
            using arrT = int[10];
            arrT *func(int);
         
         2.不使用類型別名:
            int (*func(int))[10];
            
         3.尾置返回型別[C++11]
            auto func()->int(*)[10];
         4.decltype方式:
           int a[10];
           decltype(a) *func();
     
      6.4 函式過載:
         返回型別, 頂層const不能充當過載的條件。
         
         const_cast 可以讓非常量版本函式呼叫 常量版本的函式。[指標 和 引用型別形參]

      6.5 特殊的語言特性:
        	預設實參:
           		 書寫在都檔案當中,可多次定義.
        	行內函數:
            		定義在標頭檔案, 可展開, 無複雜控制語句的函式
      		 constexpr 函式:
            		引數型別 和 返回值都必須是字面值型別。
           		 函式體只能有一條return 語句
           		 返回值是否是constexpr 看引數。
        	除錯幫助:
         		   cassert 標頭檔案中的巨集, 以及__func__ 和 __FILE__,__TIME__,
__LINE__,__TIME__ 等預處理變數
     6.6 函式匹配:
           候選函式集合 : 名字 和 可見性來篩選
           可行函式集合 : 引數的數量 和 可行的型別匹配篩選
           最佳匹配: 每單個引數來看, 如果每個引數的最佳匹配相同就有最佳匹配, 否則ambiguous [
           有一套等級劃分來決定型別匹配的優劣 ]
     6.7 函式指標:
            引數是函式指標:
                    void func(int f(int,int))
                    void func(int (*pf)(int,int)) //等價於上
            返回函式的指標:
                   別名方式: 
                       	   using funcType = int (int, int);
                       	   funcType * func(); 
                   不用別名方式             
                       	    int (*func())(int, int){}
                   尾巴置型別放複雜型別:
                       	    auto func() -> int (*)(int, int);