Delta函式,C++的異常捕捉,以及矩陣求導等一些碎碎唸的概念
阿新 • • 發佈:2020-11-25
1.Delta函式:
簡而言之就是除了0處取1其他地方都取0的函式,嚴格來講它並不是函式啊。。
2.矩陣求導等一些公式:
https://blog.csdn.net/a493823882/article/details/81324037
3.C++異常捕捉
C++之異常捕獲和處理
一、簡介
在C++語言中,異常處理包括:throw表示式
,try語句塊
,一套異常類
。其中,異常類用於在throw表示式和相關的catch子句之間傳遞異常的具體資訊。exception標頭檔案定義了最普通的異常類exception,它只報告異常的發生,不提供任何額外資訊。以下是定義在stdexcept標頭檔案中的常用的異常類:
異常類 | 解釋 |
---|---|
exception | 最常見的問題 |
runtime_error | 只有在執行時才能檢測出的問題 |
range_error | 執行時錯誤:生成的結果超出了有意義的值域範圍 |
overflow_error | 執行時錯誤:計算上溢 |
underflow_error | 執行時錯誤:計算下溢 |
logic_error | 程式邏輯錯誤 |
domain_error | 邏輯錯誤:引數對應的結果值不存在 |
invalid_argument | 邏輯錯誤:引數無效 |
length_error | 邏輯錯誤:試圖建立一個超過該型別最大長度的物件 |
out_of_range | 邏輯錯誤:使用一個超出有效範圍的值 |
異常類只定義了一個名為what的成員函式,該函式沒有任何引數,返回值是一個指向C風格字串的const char*。
二、基本用法
直接貼程式碼,簡單測試一下:
#include <stdexcept>
#include <iostream>
using namespace std;
void test() {
throw runtime_error("just for test!");
}
int main() {
try {
test();
} catch(runtime_error err) {
cout << err.what() << endl;
}
return 0;
}
/*
* 執行的結果不出意料,便是:just for test!
* 可以有多個catch語句塊
* 找到了匹配的runtime_error便執行相應的catch語句塊程式碼
*/
注意:當執行一個throw時,跟在throw後面的語句將不再被執行。且只有在catch語句塊中可以使用
throw;
這樣的語句,表示當前的catch語句不足與完整地處理好這個異常,於是決定由更上一層的函式接著處理。
三、noexcept
概括來說,這個關鍵字有兩種用法:作為函式限定符,作為一個一元運算子返回一個bool型別的右值常量表達式。
第一個用法中,noexcept放在函式的後面,一般而言,對於成員函式來說,放在const後面,而放在final、override或虛擬函式的=0之前。其表示該函式不會丟擲異常,但如下情況也可以順利編譯:
void f() noexcept {
throw exception();
}
需要注意的是,函式指標及該函式指向的函式必須具有一致性的異常說明,如下:
void (*pf1)(int) noexcept;
void f() noexcept {}
void t() {}
pf1 = f; //正確,因為f能保證不丟擲異常
pfi = t; //錯誤,因為t不能保證
第二個用法中,可以如下使用:
noexcept(f()) //若f保證不丟擲異常,則返回true
//一個常用用法,等價於void t() {}
void t() noexcept(false) {}
//以下保證f和g的異常型別一致
void f() noexcept(noexcept(g()));
四、定義自己的異常類
假設你想設計一個異常類,名為test_error,其的效果和runtime_error一樣,可以用如下程式碼:
class test_error : public runtime_error {
public:
explicit test_error(const string &s):
runtime_error(s) {}
};