表达式 & 语句
文章目录
显示类型转换
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);