查看: 102|回复: 1

C++开发高频面试题 31-35

[复制链接]

3

主题

11

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2023-3-31 13:11:58 | 显示全部楼层 |阅读模式
31 为什么要在 C++ 中进行异常处理?




在 C++ 中进行异常处理可以提高程序的健壮性和可靠性,减少程序崩溃和数据损坏的可能性,同时也可以提高代码的可读性和可维护性

具体来说,C++ 中的异常处理机制可以帮助开发者处理程序中的错误和异常情况,包括但不限于:


  • 运行时错误,如除以零、数组越界等;
  • 系统错误,如内存不足、文件打开失败等;
  • 自定义错误,如输入非法参数等。
通过在代码中使用 try-catch 块,程序可以在遇到异常时跳转到异常处理代码,从而避免程序崩溃和数据损坏。异常处理机制还可以帮助开发者追踪错误和调试代码,使得程序的调试和维护更加容易。
除此之外,C++ 中的异常处理机制还可以提高代码的可读性和可维护性。使用异常处理机制可以使得代码结构更加清晰,异常处理代码可以单独编写并集中处理所有可能出现的异常情况,避免代码重复和冗余。另外,在异常处理代码中,可以使用更加清晰的语句和命名,使得代码更加易读易懂。

举例说明如何使用 try、throw和catch关键字进行 C++ 异常处理


#include <iostream>
#include <stdexcept>

using namespace std;

int main() {
    int dividend, divisor;
    cout << "Please enter the dividend: ";
    cin >> dividend;
    cout << "Please enter the divisor: ";
    cin >> divisor;

    try {
        if (divisor == 0) {
            throw runtime_error("Divide by zero error!");
        }
        int quotient = dividend / divisor;
        cout << "The quotient is: " << quotient << endl;
    } catch (const exception& ex) {
        cerr << "Exception: " << ex.what() << endl;
    }

    return 0;
}

在这个例子中,程序要求用户输入被除数和除数,然后计算它们的商并输出结果。但是,如果除数为0,就会发生除以零的错误,程序会崩溃并且无法计算结果。为了避免这种情况,我们可以使用异常处理机制来捕获这个错误并进行处理。
在主函数中,我们首先使用 try 关键字将可能发生异常的代码块括起来。在这个代码块中,我们首先判断除数是否为0,如果为0,就会抛出一个 runtime_error 类型的异常,并将错误信息作为字符串传递给异常。这里我们使用了 throw 关键字来抛出异常。
如果没有抛出异常,程序将继续执行除法操作,并计算出商。最后,我们使用 catch 关键字来捕获可能发生的异常。在这里,我们使用了一个常量引用 ex 来引用异常对象,并使用 ex.what() 方法来获取异常信息并输出到标准错误流中。
总之,使用 try、throw 和 catch 关键字可以帮助我们捕获和处理程序中可能发生的异常,从而提高程序的健壮性和可靠性。

举例说明如何使用函数的异常声明列表?


在 C++ 中,函数的异常声明列表可以用来告诉调用者该函数可能抛出哪些类型的异常
这样,在调用函数时,调用者就可以根据函数的异常声明列表来准备处理可能出现的异常,从而提高程序的健壮性和可靠性。
下面通过一个简单的例子来说明如何使用函数的异常声明列表:
#include <iostream>
#include <stdexcept>

using namespace std;

int divide(int dividend, int divisor) throw(runtime_error) {
    if (divisor == 0) {
        throw runtime_error("Divide by zero error!");
    }
    return dividend / divisor;
}

int main() {
    int dividend, divisor;
    cout << "Please enter the dividend: ";
    cin >> dividend;
    cout << "Please enter the divisor: ";
    cin >> divisor;

    try {
        int quotient = divide(dividend, divisor);
        cout << "The quotient is: " << quotient << endl;
    } catch (const exception& ex) {
        cerr << "Exception: " << ex.what() << endl;
    }

    return 0;
}
在这个例子中,我们定义了一个 divide 函数,该函数用来计算两个整数的商。在函数声明的时候,我们使用了 throw(runtime_error) 来指定函数可能抛出 runtime_error 类型的异常。
在函数的实现中,我们首先判断除数是否为0,如果为0,就会抛出一个 runtime_error 类型的异常,并将错误信息作为字符串传递给异常。如果没有抛出异常,函数将返回计算出的商。
在主函数中,我们首先调用 divide 函数来计算商。由于 divide 函数可能抛出异常,我们在调用时使用了 try-catch 块来捕获可能出现的异常。如果有异常被抛出,就会被 catch 块捕获并输出异常信息。否则,程序将继续执行并输出计算出的商。
总之,使用函数的异常声明列表可以帮助调用者准备处理可能出现的异常,从而提高程序的健壮性和可靠性。

举例说明如何使用C++标准异常类 exception?

C++ 标准库提供了一个名为 std::exception 的基类,它定义了一个虚拟成员函数 what(),可以返回一个描述异常的 C 风格字符串。我们可以使用该类的派生类来表示不同类型的异常,并重载 what() 函数以提供自定义的异常信息。
下面通过一个简单的例子来说明如何使用 std::exception 类:
#include <iostream>
#include <exception>

using namespace std;

class MyException : public exception {
public:
    virtual const char* what() const throw() {
        return "My custom exception";
    }
};

int main() {
    try {
        // Throw a MyException
        throw MyException();
    } catch (exception& e) {
        cout << "Exception caught: " << e.what() << endl;
    }

    return 0;
}
在这个例子中,我们定义了一个名为 MyException 的自定义异常类,它继承自 std::exception。我们重载了 what() 函数,以提供一个自定义的异常信息。
在主函数中,我们在一个 try 块中抛出了一个 MyException 类型的异常。由于 MyException 继承自 std::exception,所以我们可以在 catch 块中捕获它,并使用 e.what() 函数来获取自定义的异常信息。
总之,通过继承 std::exception 类并重载 what() 函数,我们可以创建自己的异常类,并提供自定义的异常信息。这样可以使我们的代码更具可读性和可维护性。

32 Static 的用法和作用是?


静态变量:在函数内部或者类中声明的变量可以使用 static 关键字来声明为静态变量。静态变量的生命周期从程序运行开始到程序结束,不会因为函数的调用而被销毁,而且在每次调用该函数时,静态变量的值都会被保留。

静态函数:在类中声明的函数可以使用 static 关键字来声明为静态函数。静态函数属于类本身而不是类的对象,在使用时无需创建类的对象,直接通过类名调用即可

静态成员变量:在类中声明的成员变量可以使用 static 关键字来声明为静态成员变量。静态成员变量是类的所有对象共享的,它的值可以被所有对象访问和修改。

class MyClass {
public:
    static int count;
};

int MyClass::count = 0;


静态类:在 C++ 中,static 关键字还可以用于声明静态类。静态类的作用是将类的作用域限制在当前文件中,避免在其他文件中被访问。静态类只能包含静态成员,不能包含非静态成员。

33 静态变量和全局变量的区别?




静态变量和全局变量都是在程序执行期间存在于静态存储区中的变量,它们的主要区别在于作用域和生存期
全局变量是在程序中定义在任何函数或代码块之外的变量,作用域为整个程序。全局变量的生存期从程序开始执行到程序结束,可以被任何函数访问
静态变量是在函数内定义的变量,并在变量类型前加上 static 关键字。静态变量的作用域被限制在定义该变量的函数内,它只能被定义该变量的函数访问。静态变量的生存期与程序运行时间相同,即在程序开始执行时分配内存,在程序结束时释放内存

静态变量和全局变量的区别如下:


  • 作用域不同:全局变量的作用域为整个程序,静态变量的作用域仅限于定义该变量的函数内。
  • 访问权限不同:全局变量可以被程序中的任何函数访问,静态变量只能被定义该变量的函数访问。
  • 生命周期不同:全局变量的生命周期为程序运行时间,静态变量的生命周期为定义该变量的函数执行期间。
由于全局变量可以被程序中的任何函数访问,而静态变量只能被定义该变量的函数访问,因此静态变量更加安全,可以避免因为全局变量被随意修改而产生不可预知的错误。同时,静态变量的作用域和生存期可以使得它在函数执行期间保持不变,方便函数在多次调用之间传递和使用数据。
<hr/>如果想再夯实一下基础并对如何写出高性能的C++代码感兴趣,可以尝试阅读:
回复

使用道具 举报

2

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2023-3-31 13:12:46 | 显示全部楼层
漏了静态全局变量
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表