C++ Primer 学习 Ch4、5 表达式与语句

表达式 & 语句

显示类型转换

static_cast

不包含底层const的类型转换,如int,double之间转换,void* 与其他类型指针转换

const_cast

只用于改变对象底层const属性

const char* pc = "hello";
char *p = const_cast<char*>(pc);
// 但是不能通过pc改变数据
// *p = 'a';
reinterpret_cast

更底层的转换,谨慎使用

int tmp = 1111111111;
int *pi = &tmp;
char *pc = reinterpret_cast<char*>(pi);
for(int i = 0; i < sizeof(int)/sizeof(char); i++)
{
    cout << *pc << endl;
    ++pc;
}
dynamic_cast

运行时类型识别,暂时不清楚

异常处理

程序某部分出现一个它无法处理的问题,应该发送信号throw,raise一个异常
异常将终止当前函数,把控制权移交给能处理异常的代码

try {
    program-statements  // 可能出现异常的代码 利用throw抛出
} catch (exception-declaration) {
    handler-statements
} catch (exception-declaration) {
    handler-statements
}
try语句

try语句块内声明的变量在块外部无法访问,在catch中也是,这和普通的一个{}作用域是符合的

catch语句

发生异常后,寻找处理代码的过程是逐级回退的,直到找到一个上层的函数中的catch符合异常类型
如果最终没能匹配上catch语句,转到terminate的标准库函数,程序非正常退出

标准异常

<exception>头文件: exception通用异常类,只报告异常发生,不提供其他信息,只有默认初始化
<stdexcept>头文件: 没有默认初始化,需要提供string或const char* 错误信息

  • runtime_error
    • overflow_error
  • logic_error
    • invalid_argument
    • out_of_range

what() 成员函数返回const char* 错误信息

catch异常后重新执行try部分代码

以下代码:使用try语句捕获除0错误,catch中询问是否是否重新输入,并重新执行try中代码,设置最大询问次数

int num1, num2;
int askCount = 0;
const int maxAskCount = 3;
do
{
    try
    {
        askCount++;
        cout << "enter two num" << endl;
        cin >> num1 >> num2;
        if (num2 == 0)
                throw std::runtime_error("divide by zero error");

        cout << "num1 / num2 = " << num1 / num2 << endl;
        askCount = maxAskCount; // 成功 直接设置 退出
    }
    catch(std::runtime_error& err)
    {
        std::cerr << err.what() << "\n";

        if (askCount >= maxAskCount)
            break;
        char choice;
        cout << "enter again? (y/n)" << "\n";
        cin >> choice;
        if (choice == 'n' || choice == 'N')
        {
            askCount = maxAskCount;
        }
    }
} while (askCount < maxAskCount);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值