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

1. typename的前世今生

(1) 历史上的原因:

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

(2) typename诞生的直接诱因

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

(3) typename的作用:

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

2. try ... catch

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

编程说明:新的异常写法

#include <iostream>
#include <string>

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...可以将函数体分为两部分
  • 异常声明能够提供程序的可读性
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 13,158评论 1 51
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,731评论 0 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,512评论 18 399
  • 今天让我们来继续说一说,书中的小主人公安妮是一个怎样的人? 我:我觉得安妮是一个争强好胜的人。跟...
    多多_bc5b阅读 1,076评论 0 0
  • 晚上刷手机,看见一个朋友秀自己谈恋爱了,底下一堆照片,忽然想起他以前转过一个话题:找对象的标准是什么,他的回答是"...
    后海的树阅读 3,770评论 0 1

友情链接更多精彩内容