模板編程的幾個關鍵字
-
模(mu)板編程初體驗
(1)template和typename
(2)模板實際上是一種抽象,C++的高級編程特性就是不斷向抽象化發展 -
export
(1)用來在cpp文件中定義一個模板類或模板函數,而它的聲明在對應的h文件中
(2)export專用于模板,類似于extern之于簡單類型
(3)實際很多環境不支持,暫不必細究,看到代碼時能認出即可 -
requires
(1)C++20引入,用于表示模板的參數約束
(2)了解即可,暫時不用管
// 寫一個函數add,完成2個數字的加和
// 假如有10種數據類型要考慮,那就要寫10個add的重載函數,非常低效
int add(int a, int b)
{return (a + b);
}double add(double a, double b)
{return (a + b);
}
// 自定義一個抽象類型,譬如命名為X,編程的時候用X編程,X的具體類型在調用函數時
// 由實參的類型來確定
template <typename T> T add(T a, T b) { return (a + b); }int test(void) {char i = 45, j = 6;cout << "a + b = " << add(i, j) << endl;double a = 45.99, b = 6.88;cout << "a + b = " << add(a, b) << endl;return 0;
}
T可以是基本數據類型(如 int、float),也可以是用戶自定義的類、結構體,甚至是其他模板類型。使用 T 可以讓你的代碼適應不同類型的輸入,提高代碼的靈活性。
C++的異常處理機制
-
何為異常處理
(1)異常exception,即運行時錯誤
(2)C中沒有異常機制,所以運行時遇到錯誤只能終止程序
(3)C++中新增了異常處理機制,允許程序在運行時攔截錯誤并處理,這樣程序就不用終止
(4)異常機制的一個典型案例就是:由用戶輸入2個數字然后相除中的除0異常 -
異常處理編程實踐
(1)try, catch, throw
(2)異常處理機制為什么優于出錯條件判斷:https://www.cnblogs.com/wkfvawl/p/10816156.html
int test(void) {// 讓用戶輸入2個數,然后程序返回他的相除cout << "please input 2 numbers" << endl;int m, n;cin >> m >> n;// C中我們這樣處理if (n == 0) {cout << "0 not good" << endl;return -1;} else {cout << "m / n = " << m / n << endl;}cout << "---other code---" << endl;return 0;
}
int test(void) {// 讓用戶輸入2個數,然后程序返回他的相除cout << "please input 2 numbers" << endl;int m, n;cin >> m >> n;// C++中用異常處理機制來處理try {// try括號里的代碼就是有可能觸發異常的代碼if (n == 0) {// throw ('A');// throw (-8);throw(6.66);}cout << "m / n = " << m / n << endl;} catch (int e) // catch的()里寫上要抓取的異常類型{cout << "catch int e" << endl;} catch (double e) // catch的()里寫上要抓取的異常類型{cout << "catch double e" << endl;} catch (char e) // catch的()里寫上要抓取的異常類型{cout << "catch char e" << endl;}cout << "---other code---" << endl;return 0;
}
-
異常和函數
(2)throw一個異常后如果沒有catch會層層向外傳遞直到被catch為止
(3)函數可以用throw列表來標識自己會拋出的異常 -
標準庫中的exception類
(1)標準庫中定義的異常類及其派生類,很多內置代碼的錯誤會拋出這些異常
(2)譬如bad_typeid,使用 typeid 運算符時,如果其操作數是一個多態類的指針,而該指針的值為 NULL,則會拋出此異常
(3)譬如bad_cast,用 dynamic_cast 進行從多態基類對象(或引用)到派生類的引用的強制類型轉換時,如果轉換是不安全的,則會拋出此異常 -
noexcept關鍵字
(1)throw(int, double, A, B, C)表示函數可能會拋出這5種類型的exception
(2)throw() 表示函數不會拋出任何異常
(3)C++11中引入noexcept關鍵字替代throw()表示函數不會拋出任何異常
noexcept(bool)
(4)沒有throw列表的函數,表示函數可能會拋出任意類型的異常
剩余關鍵字和總結
剩余一些關鍵字
(1)線程相關:thread_local (C++11 起)
(2)import和module (C++20)
(3)協程相關:
co_await (C++20 起)
co_return (C++20 起)
co_yield (C++20 起)
(4)并發相關:synchronized (TM TS)
(5)反射相關:reflexpr (反射 TS)
(6)其他:
transaction_safe (TM TS)
transaction_safe_dynamic (TM TS)
atomic_cancel (TM TS)
atomic_commit (TM TS)
atomic_noexcept (TM TS)
- 總結
(1)C++關鍵字和復雜度遠超過C語言,語言特性較多
(2)面向對象編程相關特性是C++的基礎核心,占比非常大
(3)模板泛型和抽象化編程是C++的重要特征,甚至可以說是精髓所在
(4)和java、python相比,C++的語法細節過多,這也是C++較難學習的重要原因
(5)不要試圖去記,以理解為主,配合代碼實驗去消化吸收,形成自己對C++的認知
(6)經典C++與C++11、14、17、20的差異其實就是相應增加的關鍵字帶來的新語言特性
總結
理解模板的概念,會使用template和typename
理解try, catch, throw使用方法
學習記錄,侵權聯系刪除。
來源:朱老師物聯網大課堂