1. cerr
std::cerr 是C++标准库中的标准错误输出流。它是一个预定义的 std::ostream 对象,用于将错误信息输出到标准错误设备。在大多数情况下,标准错误设备通常与控制台窗口或终端相关联,因此错误消息会直接显示在控制台上。(所以我们用cerr的时候,看上去效果和cout一样)
与 std::cout 类似,std::cerr 也是一个输出流对象,你可以使用它的 << 操作符来将数据输出到标准错误流。例如,你可以使用 std::cerr 输出错误信息:
#include <iostream>
int main() {
int x = 42;
if (x > 10) {
std::cerr << "Error: x should be less than or equal to 10." << std::endl;
}
return 0;
}
在这个例子中,如果 x 大于10,错误消息将会被输出到标准错误流 std::cerr,而不是标准输出流 std::cout。这是一个惯例,通常用于输出错误和警告信息,因为标准错误流不会被重定向到文件或其他输出目标,它会直接在控制台上显示。
2. what() 函数
what()函数的使用可以看上一篇文章的代码,我在这里直接是这个函数的定义含义。
也就是这个函数:
virtual const char* what() const throw()
在C++中,virtual const char* what() const throw() 是一个常见的异常类成员函数的声明,用于提供异常的描述信息。它定义在标准库的 std::exception 类中,是一个纯虚函数。其他的标准异常类通常会继承自 std::exception,并且它们也会实现这个函数来提供描述异常的信息。
这个函数的含义是:
- virtual: 声明这个函数是虚函数,可以在派生类中被重写。
- const char* what() const: 这是函数的原型,它返回一个指向常量字符数组(C字符串)的指针,表示异常的描述信息。const 关键字表示这个函数不会修改对象的状态。
- throw(): 这个部分表示这个函数不会抛出任何异常。在C++03标准中,这个部分被用于声明函数不会抛出任何异常。然而,在C++11及之后的标准中,throw() 被替代为 noexcept 关键字。
具体来说,当你定义一个自定义的异常类时,你通常会从 std::exception 派生,并且你需要实现 what() 函数来提供你的异常的描述信息。例如:
class MyException : public std::exception {
public:
virtual const char* what() const noexcept override {
return "My custom exception occurred";
}
};
在这个例子中,MyException 类继承自 std::exception,并且重写了 what() 函数,提供了异常的描述信息。注意,在C++11及之后的标准中,使用 noexcept 关键字替代了 throw()。
下篇文章会介绍一下c++11新特性:noexcept.