C++笔记 第六十八课 拾遗:令人迷惑的写法---狄泰学院

如果在阅读过程中发现有错误,望评论指正,希望大家一起学习,一起进步。
学习C++编译环境:Linux

第六十八课 拾遗:令人迷惑的写法

1.下面的程序想要表达什么意思?

在这里插入图片描述
历史上的原因
早期的C++直接复用class关键字来定义模板
但是泛型编程针对的不只是类类型
class关键字的复用使得代码出现二义性
typename诞生的直接诱因
自定义类类型内部的嵌套类型
不同类中的同一个标识符可能导致二义性
编译器无法辨识 标识符究竟是什么

68-1 模板中的二义性

#include <iostream>
#include <string>
using namespace std;
template < class T >
class Test
{
public:
    Test(T t) 
    { 
        cout << "t = " << t << endl;
    }
};
template < class T >
void func(T a[], int len)
{
    for(int i=0; i<len; i++)
    {
        cout << a[i] << endl;
    }
}
//
//
int a = 0;//全局变量
class Test_1
{
public:
    static const int TS = 1;
};
class Test_2
{
public:
    struct TS
    {
        int value;
    };
};
template
< class T >
void test_class()
{
    typename T::TS * a;        // 1. 通过泛指类型T内部的数据类型 TS定义指针变量a (推荐的解读方式)          // 2.使用泛指类型T内部的静态成员变量TS与全局变量a进行乘法操作
}
int main(int argc, char *argv[])
{
    // test_class<Test_1>();
    test_class<Test_2>();
    
    return 0;
}
无输出结果

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

2.下面的程序想要表达什么意思?

在这里插入图片描述
try…catch用于分隔正常功能代码与异常处理代码
try…catch可以直接将函数实现分隔为2部分
函数声明和定义时可以直接指定可能抛出的异常类型
异常声明成为函数的一部分可以提高代码可读性
函数异常声明的注意事项
函数异常声明是一种与编译器之间的契约
函数声明异常后就只能抛出声明的异常
抛出其他异常将导致程序运行终止
可以直接通过异常声明定义无异常函数

68-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(int argc, char *argv[])
{
    test(5);
    
    test(10);
    
    return 0;
}
最终运行结果
func(i, i) = 10
Exception...

出现错误:
在这里插入图片描述
错误原因:
The standard says the example is ill-formed, so GCC was changed to reject it for PR31952. To fix the error either rename one of the variables or use an additional nested scope for the second one.译:标准说这个例子是不正确的,所以GCC被改为拒绝PR31952。 要修复错误,请重命名其中一个变量,或者为第二个使用额外的嵌套范围
修改方法:
catch(int k)
{
cout << "Exception: " << k << endl;
}
小结
class可以用来在模板中定义泛指类型(不推荐)
typename是可以消除模板中的二义性
try…catch可以将函数体分为2部分
异常声明能够提供程序的可读性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值