博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第六十八课、拾遗:令人迷惑的写法
阅读量:6237 次
发布时间:2019-06-22

本文共 2357 字,大约阅读时间需要 7 分钟。

一、 typename的前世今生

1、定义模板时使用class的历史原因

(1)、早期的C++直接复用class关键字来定义模板

(2)、但是泛型编程针对的不只是类类型

(3)、class关键字的复用使得代码出现二义性

2、typename诞生的直接诱因

(1)、自定义类类型内部的嵌套类型

(2)、不同类中同一个标识符可能导致二义性

(3)、编译器无法辨识标识符究竟是什么

3、typename的作用

(1)、模板定义中声明泛指类型

(2)、明确告诉编译器其后的标识符为类型

#include 
#include
using namespace std;template
//旧式写法,用class而不是typename定义模板class Test{public: Test(T t) { cout << "t = " << t << endl; }};template
void func( T a[], int len){ for (int i = 0; i
void test_class(){ //以下句子可能出现两种解读方法,出现了二义性) T::TS * a; //1. 通过泛型T内部类类型定义指针变量a.(大部分人的解读方式) //2. 使用泛型T内部的静态成员变量TS与全局变量a进行乘法操作 //默认下,编译器会按2的方式解读,而不是我们期望的1的方式 //如何解决以上的二义性问题呢?引入新的关键字typename,将它放在类型前面 //以说明其紧跟的标识符是类型名而不是变量,形式如下 //typename T::TS* a; //T::TS前用typename修饰,明确地表示其为一个类类型 //也可以用class来修饰。但这样会让人疑惑,因为class //一般用于声明类的,但这里用法给人感觉好象是用来 //定义指针,所以建议用新的typename关键字。索性, //把template
也改为template
//这样更彻底。即,在定义模板时完全抛弃class关键字}int main(int argc, char *argv[]){ test_class
(); //编译通过,说明编译器是按2的方式去解读。 test_class
(); //编译不过,说明编译器是仍是按1的方式去解读 return 0;}

二、 另类的try-catch写法

1、函数异常声明中的try-catch块

(1)、try-catch用于分隔正常功能代码与异常处理代码

(2)、try-catch可以直接将函数实现分隔为2部分

(3)、函数声明和定义时可以直接指定可能抛出的异常类型

(4)、异常声明成为函数的一部分可以提高代码可读性

2、注意事项

(1)、函数异常声明是一种与编译器之间的契约

(2)、函数声明异常后只能抛出声明的异常

A、抛出其它异常将导致程序运行终止

B、可以直接通过异常声明定义无异常函数

#include 
#include
using namespace std;int func(int i, int j) throw(int, char) //异常声明,表示该函数 //可能抛出int和char两种类型的异常{ if ((0 < j) && (j < 10)) { return (i + j); } else { throw '0'; //抛出char型,合法。因为符合异常声明,也可以抛出整型 //如 throw 0;但除了这两种外的都不行,那会程序崩溃。 }}//以下的写法已经不被推荐(g++下直接报错、VS2013下会出警告)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(int argc, char *argv[]){ test(5); //正常 test(10); //抛异常 return 0;}//输出结果/* func(i, i) = 10Exception...*/

三、小结

(1)、class可以用来模板中定义泛指类型(不推荐)

(2)、typename是可以消除模板中的二义性

(3)、try-catch可以将函数体分成2部分

(4)、异常声明能够提高程序的可读性

转载于:https://www.cnblogs.com/gui-lin/p/6384727.html

你可能感兴趣的文章
万事都源于一个字:缘
查看>>
jQuery表单验证插件
查看>>
Centos 查询大文件
查看>>
Java 对byte,short,char,int,long 运算时自动类型转化情况说明
查看>>
比较详细的MySQL的复制原理及配置
查看>>
创建启动虚拟网卡
查看>>
编译安装部署最新C++开发环境
查看>>
DNS服务
查看>>
ActiveMQ(21):Consumer高级特性之管理持久化订阅
查看>>
ActiveMQ(15):Message Dispatch的消息游标与异步发送
查看>>
Kubernetes+Etcd-v1.5.2 分布式集群部署
查看>>
表连接
查看>>
Delphi XE2 之 FireMonkey 入门(10) - 常用结构 TPoint、TPointF、TSmallPoint、TSize、TRect、TRectF 及相关方法...
查看>>
我的友情链接
查看>>
“对人不对事”和“对事不对人”
查看>>
CSS实现pre标签中内容换行方法
查看>>
领导牛B轰轰的 https 介绍应用
查看>>
Centos7下的Openssl和CA
查看>>
windows 2003防止网卡被禁用的设置
查看>>
lvs健康检测脚本
查看>>