模板编程的几个关键字
-
模(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使用方法
学习记录,侵权联系删除。
来源:朱老师物联网大课堂