diff --git a/day8/homework/h1.cpp b/day8/homework/h1.cpp new file mode 100644 index 0000000..b9c024a --- /dev/null +++ b/day8/homework/h1.cpp @@ -0,0 +1,33 @@ +// const修饰的成员虚函数,能否在子类中重写?请举例说明 +// 可以 +#include + +using namespace std; + +class A +{ +public: + virtual void show() const + { + cout << "A" << endl; + } +}; + +class B : public A +{ +public: + virtual void show() const override + { + cout << "B" << endl; + } +}; + +int main() +{ + A *p = new B; + p->show(); // B + + B *q = new B; + q->show(); // B + return 0; +} diff --git a/day8/homework/h2.cpp b/day8/homework/h2.cpp new file mode 100644 index 0000000..10a10a9 --- /dev/null +++ b/day8/homework/h2.cpp @@ -0,0 +1,34 @@ +// throw() 和throw有什么区别?请举例说明 +// 1. throw()是函数声明,表示该函数不会抛出任何异常 +// 2. throw是抛出异常的关键字 +// 3. throw()是函数声明,throw是语句 +#include + +using namespace std; + +void show(int n) throw() // throw() 表示异常抛出限制: 不抛出任何异常 +// void show(int n) throw(int ) // throw(int) 表示只抛出 int 类型的异常 +{ + if (n == 0) + { + throw 0; // throw 0 表示抛出 int 类型的异常 + } + cout << "n = " << n << endl; +} + +int main() +{ + try + { + show(0); + } + catch (const int &e) + { + cout << "捕获异常: " << e << endl; + } + catch (...) + { + cout << "捕获其他异常" << endl; + } + return 0; +} diff --git a/day8/homework/h3.cpp b/day8/homework/h3.cpp new file mode 100644 index 0000000..612dcfc --- /dev/null +++ b/day8/homework/h3.cpp @@ -0,0 +1,58 @@ +// 编写一个C++ 程序,读取一个文件的内容并打印到控制台。 在文件读取过程中处理以下异常情况: 1)如果文件打开失败,则抛出一个自定义的异常对象 FileOpenException。 2)如果文件读取过程中发生错误,则抛出一个自定义的异常对象 FileReadException。 +// 【要求】在 main 函数中调用文件读取函数,并捕获并处理可能抛出的异常。 + +#include + +using namespace std; + +// 自定义异常类 +class FileOpenException : public exception +{ +public: + const char *what() const throw() + { + return "文件打开异常"; + } +}; + +class FileReadException : public exception +{ +public: + const char *what() const throw() + { + return "文件读取异常"; + } +}; + +int main() +{ + FILE *fp = fopen("test.txt", "r"); + + try + { + if (fp == NULL) + { + throw FileOpenException(); // 抛出自定义文件打开异常 + } + } + catch (exception &e) + { + cout << "捕获异常: " << e.what() << endl; + } + + char ch; + try + { + // EOF 表示到达文件结尾 + if (fscanf(fp, "%c", &ch) == EOF) + throw FileReadException(); // 抛出自定义文件读取异常 + } + catch (exception &e) + { + cout << "捕获异常: " << e.what() << endl; + } + + fclose(fp); + + return 0; +} diff --git a/day8/homework/h4.cpp b/day8/homework/h4.cpp new file mode 100644 index 0000000..b09c53f --- /dev/null +++ b/day8/homework/h4.cpp @@ -0,0 +1,54 @@ +// 编写一个C++ 程序,动态分配一个整型数组,并根据用户输入的索引值访问数组元素。 在访问数组元素时处理以下异常情况: 1)如果数组分配内存失败,则抛出一个自定义的异常对象 MemoryAllocationException。 2)如果用户输入的索引超出了数组的范围,则抛出一个自定义的异常对象 IndexOutOfBoundsException。 +// 【要求】在 main 函数中调用动态内存分配函数,并捕获并处理可能抛出的异常。 +#include + +using namespace std; + +// 自定义异常类 +class MemoryAllocationException : public exception +{ +public: + const char *what() const throw() + { + return "内存分配异常"; + } +}; + +class IndexOutOfBoundsException : public exception +{ +public: + const char *what() const throw() + { + return "索引越界异常"; + } +}; + +int main() +{ + int *arr = new int[10]; // 动态分配一个整型数组 + try + { + if (arr == NULL) + throw MemoryAllocationException(); + + // 当不抛出异常时,继续执行数组的赋值操作 + arr[0] = 1; + arr[1] = 2; + arr[2] = 3; + arr[3] = 4; // 其余元素会被初始化为 0 + + int n; + cout << "请输入索引值: "; + cin >> n; + if (n < 0 || n > 9) + throw IndexOutOfBoundsException(); + // 当不抛出异常时,继续执行数组的访问操作 + cout << "arr[" << n << "] = " << arr[n] << endl; + } + catch (exception &e) + { + cout << "捕获异常: " << e.what() << endl; + } + + return 0; +} diff --git a/day8/homework/h5.cpp b/day8/homework/h5.cpp new file mode 100644 index 0000000..e8e4f23 --- /dev/null +++ b/day8/homework/h5.cpp @@ -0,0 +1,39 @@ +// 编写一个C++ 函数 divideNumbers,接受两个整数作为参数,并返回它们的商。 在函数中处理以下异常情况: 1)如果除数为0,则抛出 std::logic_error 异常类的一个实例,并传递适当的错误消息。 2)如果被除数为0,则抛出 std::runtime_error 异常类的一个实例,并传递适当的错误消息。 +// 【要求】在 main 函数中调用 divideNumbers,并捕获并处理可能抛出的异常。 +#include + +using namespace std; + +int divideNumbers(int a, int b) +{ + if (b == 0) + throw std::logic_error("除数为0"); + if (a == 0) + throw std::runtime_error("被除数为0"); + return a / b; // 结果为整数商 +} + +int main() +{ + try + { + cout << "请输入两个整数:" << endl; + int a, b; + cin >> a >> b; + cout << a << " 和 " << b << " 的商为:" << divideNumbers(a, b) << endl; + } + catch (const std::logic_error &e) + { + cout << "捕获异常:" << e.what() << endl; + } + catch (const std::runtime_error &e) + { + cout << "捕获异常:" << e.what() << endl; + } + catch (...) + { + cout << "捕获其他异常" << endl; + } + + return 0; +} diff --git a/day8/homework/h6.cpp b/day8/homework/h6.cpp new file mode 100644 index 0000000..18a23eb --- /dev/null +++ b/day8/homework/h6.cpp @@ -0,0 +1,33 @@ +// 编写一个C++ 程序,读取一个文件的内容并打印到控制台。 在文件读取过程中处理以下异常情况: 1)如果文件打开失败,则抛出 std::runtime_error 异常类的一个实例,并传递适当的错误消息。 2)如果文件读取过程中发生错误,则抛出 std::ios_base::failure 异常类的一个实例,并传递适当的错误消息。 +// 【要求】在 main 函数中调用文件读取函数,并捕获并处理可能抛出的异常。 +#include + +using namespace std; + +int main() +{ + FILE *fp = fopen("test.txt", "r"); + try + { + if (fp == NULL) + throw std::runtime_error("文件打开异常"); + } + catch (const std::runtime_error &e) + { + cout << "捕获异常:" << e.what() << endl; + } + + char ch; + try + { + if (fscanf(fp, "%c", &ch) == EOF) + throw std::ios_base::failure("文件读取异常"); + } + catch (const std::ios_base::failure &e) + { + cout << "捕获异常:" << e.what() << endl; + } + + fclose(fp); + return 0; +} diff --git a/day8/homework/test.txt b/day8/homework/test.txt new file mode 100644 index 0000000..31e0fce --- /dev/null +++ b/day8/homework/test.txt @@ -0,0 +1 @@ +helloworld