模板编程的几个关键字

  • 模(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使用方法

学习记录,侵权联系删除。
来源:朱老师物联网大课堂

07-04 09:44