程序小設計的問題

auto power(double x,int n)->double 函數的返回類型放在函數頭中“->”後面,稱爲拖尾返回類型。

數組是函數中唯一不能按值傳遞的類型

雖然rvalue引用形參可以引用一個rvalue-即表達式的臨時結果,但rvalue引用形參本身並不是一個rvalue,而是一個lvalue


可以將函數定義成能夠接受任意數量的實參,將省略號(3個句點)寫在函數定義中形參列表的最後,即可表示調用該函數時可以提供數量可變的實參。

int sum(int count,...)                                            va_list類型是在cstdarg頭文件中定義的,該指針用來依次指向各個實參

{                                                                           va_start宏用來初始化arg_ptr,使其指向列表中的第一個實參。

   va_list arg_ptr;                                                  宏的第二個實參是函數形參列表中省略號前面固定形參的名稱,用來確定第 

   va_start(arg_ptr,count);                                     一個可變實參的位置。

   for(int i {};i<count;i++)                                      va_arg宏返回arg_ptr指向的位置存儲的實參值,並使arg_ptr遞增,以指向

        sum+=va_arg(arg_ptr,int);                            下一個實參值,第二個實參是第一個形參的類型

    va_end(arg_ptr);                                                 重置arg_ptr

     return sum;

}


在函數中動態申請內存空間並不會隨着該函數的結束而消失毀滅,直到delete纔會被銷燬。

通常情況下,程序應該由大量小函數,而非少量大函數組成。


指針可以存儲函數的地址,可以通過指針來調用函數,稱爲函數指針,

函數指針的通用形式爲:return_type (*pointer_name) (list of_parameter_types);指針的括號爲必須的!

函數指針的聲明有三部分組成:指向函數的返回類型,指針名稱,指向函數的形參類型

如同指向變量一樣,必須確保在調用函數前初始化函數指針,如果沒有初始化,則必定會出現災難性故障。

long product(long a,long b);
long (*pdo_it)(long,long);
pdo_it=product;//函數指針初始化
pdo_it(3,5);//調用函數

函數指針的數組

double sum(const double,const double);
double product(const double,const double);
double differenct(const double,const double);
double (*pfun[])(const double,const double){sum,product,differenct};
要調用指針數組第二個元素,則可以
pfun[1](2.5,3.5);

異常不能替代程序中應該有的數據檢查和驗證,異常真正適用於可能出現異常並且接近致命狀態的環境。

try-標識可能出現異常的代碼塊,try塊後面必須緊跟至少一個catch塊。

throw-使異常狀態產生,並拋出特定類型的異常

catch-標識處理異常的代碼塊

try
{
   cout<<endl<<"Hour"<<++hour;
   if(0==count)
     throw "zero count -calculation not 
             possible";
    cout<<"minutes per item:"<<time/cout;        
}
catch(const char aMessage[])
{
   cout<<endl<<aMessage<<endl;
}

當執行throw語句時,控制權立即傳遞給catch代碼塊中的第一條語句,因此拋出異常時將繞過除法的語句

如果希望使某個catch代碼塊處理try代碼塊中拋出的任何異常,則必須將省略號放入異常聲明的圓括號之間:

catch(...)
{

}

捕獲異常時,可能希望把它傳送給調用程序,執行某些附加操作,而不是在catch塊中處理,此時可以

catch(type2 ex)
{ 
   throw;
}

使用沒有操作數的throw,會重新拋出要處理的異常,在catch塊中,只能使用沒有操作數的throw,重新拋出異常會使外部的try/catch塊或該函數的調用者捕獲異常

new操作符拋出的異常是std::bad_alloc,bad_alloc是new標準頭文件定義的類型


函數重載允許使用相同的函數名定義多個函數,條件是函數的形參列表各不相同,不同的返回類型不足以區別函數

所有函數都有簽名,函數的簽名由名稱和形參列表確定,程序所有函數都必須有唯一的簽名,否則不能編譯程序


函數模板

template<typename T>T max(const T x[],const size_t len)
{
   T maximum{x[0]};
   for(size_t i{1};i<len;i++)
      if(maximum<x[i])
         maximum=x[i];
   return maximum;
}

函數模板定義中任何出現T的位置,都將由創建該模板的實例時提供具體的類型實參

使用模板不能減小已編譯程序的大小,編譯器生成需要的每一個函數的源代碼版本,使用時直接調用


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