68_拾遗:令人迷惑的写法

1. typename的前世今生

(1) 历史上的原因:

  • 早期的C++直接复用class关键字来定义模板
  • 但是泛型编程针对的不只是类类型
  • class关键字的复用使得代码出现二义性

(2) typename诞生的直接诱因

  • 自定义类类型内部的嵌套类型
  • 不同类中的同一个标识符可能导致二义性
  • 编译器无法辨识标识符究竟是什么

(3) typename的作用:

  1. 在模板定义中声明泛指类型
  2. 明确告诉编译器其后的标识符为类型

2. try ... catch

  • try...catch 用于分割正常功能代码异常处理代码
  • try...catch 可以直接将函数实现分隔为2部分
  • 函数声明和函数定义时可以直接指定可能抛出的异常类型
  • 异常声明成为函数的一部分可以提高代码可读性
  • 函数异常声明的注意事项
    (1) 函数异常声明是一种与编译器之间的契约
    (2) 函数声明异常后就只能抛出声明的异常,抛出其它异常将导致程序运行终止,可以直接通过异常声明定义无异常函数

编程说明:新的异常写法

#include 
#include 

using namespace std;

int func(int i, int j) throw(int, char)
{
    if( (0 < j) && (j < 10) )
    {
        return i + j;
    }
    else
    {
        throw '0';
    }
}

void test(int i) try
{
    cout << "func(i, i) = " << func(i, i) << endl;
}
catch(int i)
{
    cout << "Exception: " << i << endl;
}
catch(...)
{
    cout << "Exception... " << endl;
}

int main()
{
    
    test(5);
    test(10);
    
    return 0;
}

输出结果:

func(i, i) = 10
Exception...

3. 小结

  • class可用来在模板中定义泛指类型(不推荐)
  • typename是可以消除模板中的二义性
  • try...catch...可以将函数体分为两部分
  • 异常声明能够提供程序的可读性

你可能感兴趣的:(68_拾遗:令人迷惑的写法)