C++面试100问(六)

C++捕获异常?

        try{ // 可能抛出异常的语句 }catch(exceptionType variable){ // 处理异常的语句 }

try和catch都是 C++ 中的关键字,后跟语句块,不能省略{ }。try 中包含可能会抛出异常的语句,一旦有异常抛出就会被后面的 catch 捕获。从 try 的意思可以看出,它只是“检测”语句块有没有异常,如果没有发生异常,它就“检测”不到。catch 是“抓住”的意思,用来捕获并处理 try 检测到的异常;如果 try 语句块没有检测到异常(没有异常抛出),那么就不会执行 catch 中的语句。

C++ exception 类的直接派生类?

        logic_error 逻辑错误。 runtime_error 运行时错误。 bad_alloc 使用 new 或 new[ ] 分配内存失败时抛出的异常。 bad_typeid 使用 typeid 操作一个 NULL 指针,而且该指针是带有虚函数的类,这时抛出 bad_typeid 异常。 bad_cast 使用 dynamic_cast 转换失败时抛出的异常。 ios_base::failure io 过程中出现的异常。 bad_exception 这是个特殊的异常,如果函数的异常列表里声明了 bad_exception 异常,当函数内部抛出了异常列表中没有的异常时,如果调用的 unexpected() 函数中抛出了异常,不论什么类型,都会被替换为 bad_exception 类型。

C++ logic_error 的派生类?

        length_error 试图生成一个超出该类型最大长度的对象时抛出该异常,例如 vector 的 resize 操作。 domain_error 参数的值域错误,主要用在数学函数中,例如使用一个负值调用只能操作非负数的函数。 out_of_range 超出有效范围。 invalid_argument 参数不合适。在标准库中,当利用string对象构造 bitset 时,而 string 中的字符不是 0 或1 的时候,抛出该异常。

C++ runtime_error 的派生类?

        range_error 计算结果超出了有意义的值域范围。 overflow_error 算术计算上溢。 underflow_error 算术计算下溢。

C++ throw 用作异常规范?

        throw 关键字除了可以用在函数体中抛出异常,还可以用在函数头和函数体之间,指明当前函数能够抛出的异常类型,这称为异常规范(Exception specification),有些教程也称为异常指示符或异常列表。请看下面的例子: double func (char param) throw (int); 这条语句声明了一个名为 func 的函数,它的返回值类型为 double,有一个 char 类型的参数,并且只能抛出 int 类型的异常。如果抛出其他类型的异常,try 将无法捕获,只能终止程序。 如果函数会抛出多种类型的异常,那么可以用逗号隔开: double func (char param) throw (int, char, exception);

C++ 虚函数中的异常规范?

        C++ 规定,派生类虚函数的异常规范必须与基类虚函数的异常规范一样严格,或者更严格。只有这样,当通过基类指针(或者引用)调用派生类虚函数时,才能保证不违背基类成员函数的异常规范。

 C++ 异常规范与函数定义和函数声明?

        异常规范在函数声明和函数定义中必须同时指明,并且要严格保持一致,不能更加严格或者更加宽松。

catch 在匹配过程中的类型转换?

        catch 在匹配异常类型的过程中,也会进行类型转换,但是这种转换受到了更多的限制,仅能进行「向上转型」、「const 转换」和「数组或函数指针转换」

cout.put():

        put() 方法专用于向输出流缓冲区中添加单个字符,其语法格式如下: ostream&put(char c); 其中,参数 c 为要输出的字符。 可以看到,该函数会返回一个 ostream 类的引用对象,可以理解返回的是 cout 的引用。这意味着,我们可以像下面这样使用 put() 函数: cout.put(c1).put(c2).put(c3); 因为 cout.put(c1) 向输出流缓冲区中添加 c1 字符的同时,返回一个引用形式的 cout 对象,所以可以继续用此对象调用 put(c2),依次类推。

cout.write()?

        write() 成员方法专用于向输出流缓冲区中添加指定的字符串,初学者可以简单的理解为输出指定的字符串。其语法格式如下: ostream&write(const char * s,streamsize n); 其中,s 用于指定某个长度至少为 n 的字符数组或字符串;n 表示要输出的前 n 个字符。 可以看到,该函数会返回一个 ostream 类的引用对象,可以理解返回的是 cout 的引用。这意味着,我们可以像下面这样使用 write() 方法: cout.write(c1, 1).write(c2, 2).write(c3, 3); 因为 cout.write(c1, 1) 向输出流缓冲区中添加 c1 字符串中第 1 字符的同时,会返回一个引用形式的 cout 对象,所以可以继续用此对象调用 write(c2, 2),向输出流缓冲区添加 c2 字符串中前 2 个字符,依次类推。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值