异常处理
异常处理概述程序终止1.执行正常结束而终止 2.程序执行中发生错误或特殊事件而终止(异常终止)• 可预测的错误• 用户自己定义的错误• 难以预测的错误 异常处理(exception handling)机制的基本思想• 采用结构化方法对程序的运行时错误进行显式管理: 1.处理的是可预料的错误或特殊事件 2.将程序中的正常处理代码与异常处理代码显式区别开来,提高程序的可读性 C++语言中的异常处理抛出异常与异常处理分离的实现 Try-Catch 执行机制 • 若程序有异常,则通过 throw 关键字创建一个异常对象,并抛出 • 将可能抛出异常的程序段嵌在 try 块保护段之中,控制通过正常的顺序执行到达 try 块,然后执行 try 子块内的保护段 • 如果在保护段执行期间没有引发异常,那么跟在 try 子块后的 catch 子句就不执行。程序继续执行紧跟在 try 块中最后一个 catch 子句后面的语句 • 如果有异常,catch 子句按其在 try 块后出现的顺序被检查。类型匹配的 catch 子句将捕获并处理异常(或继续抛出异常) •...
继承和派生
继承/派生的概念当定义一个新的类 B 时,如果发现类 B 拥有某个已写好的类 A 的全部特点,此外还有类 A 没有的特点,那么就不必从头重写类 B,而是可以把类 A 作为一个“基类”(也称“父类”),把类 B 写为基类 A 的一个“派生类”(也称“子类”)。这样,就可以说从类 A “派生”出了类 B,也可以说类 B “继承”了类 A。 派生类是通过对基类进行扩充和修改得到的。基类的所有成员自动成为派生类的成员。 语法与访问控制class 派生类名:继承访问控制 基类类名{成员访问控制: 成员声明列表; }; 继承访问控制和成员访问控制均由保留 public、protected、private 来定义,缺省均为 private。private(私有的)public...
排序
排序sort 函数ort 是 C++ 库中的一个高效排序函数,基于 快速排序 或 内省排序 实现,平均时间复杂度 O(n log n) 默认升序排序(从小到大) 而实现其他排序方式可以自己编写一个函数 cmp 作为 sort 的第三个参数例: #include<bits/stdc++.h>using namespace std;struct di{ int x; int y; int z;};bool cmp(di a,di b){ if(a.z>b.z){ return 1; } else{ return 0; }}double jl(di a,di b){ return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)+pow(a.z-b.z,2));}int n;int main(){ cin>>n; struct di...
运算符重载
运算符重载运算符重载的主要目的是:让运算符适用于自定义类型(类或结构体) 运算符重载概念运算符重载是具有特殊函数名的函数,也具有返回值类型,函数名和参数列表重载的运算符可以理解为带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。 重载的两种方法1.类成员函数运算符重载(类内定义)return_type class_name::operator op(operand2) {}重载二元运算符时,成员运算符函数只需显式传递一个参数(即二元运算符的右操作数),而左操作数则是该类对象本身,通过this指针隐式传递。 重载一元运算符时,成员运算符函数没有参数,操作数是该类对象本身,通过this指针隐式传递 2.友元函数运算符重载(类外定义)return_type operator op(operand1, operand2) {} 运算符重载至少需要一个操作数是用户定义的类型 MyClass operator+(MyClass a, int b); // 合法(MyClass 是用户定义类型)int...
无标题
整数转字符 :数字 + ‘0’ 的正确场景 :仅适用于 单个数字(0-9) 转字符a % 4 的结果是一个 0 到 3 的整数。‘0’ 的 ASCII 码是 48,所以:0 + ‘0’ = 48 → ‘0’1 + ‘0’ = 49 → ‘1’2 + ‘0’ = 50 → ‘2’3 + ‘0’ = 51 → ‘3’这样就将整数 0-3 转换为对应的字符’0’到’3’。 字符转整数 :反过来,字符’0’到’3’减去’0’:‘0’ - ‘0’ = 0‘1’ - ‘0’ = 1‘2’ - ‘0’ = 2‘3’ - ‘0’ = 3这样就将字符’0’到’3’转换为对应的整数 0-3。 关键点总结操作 作用 示例int + ‘0’ 将整数 0-9 转换为对应字符 2 + ‘0’ → ‘2’char - ‘0’ 将字符’0’-‘9’转换为对应整数 ‘2’ - ‘0’ → 2std::to_string() 直接转换任意类型为字符串 std::to_string(42) →...
数据抽象和类II
数据抽象和类 IIC 与 C++动态对象(变量)管理堆(Heap)• 共享的对象(变量)空间• 由 stdlib 库管理 C必须 #include <stdlib.h>• 申请空间,void * malloc(size_t)• 释放空间,void free(void *) #include<stdio.h>#include<stdlib.h>typedef struct { int x; int y; } Point;int main() {// 分配变量或一维可变数组Point *p1 = malloc(sizeof(Point) * 10);// 分配二维数组(n,m是常数)Point (*p2)[2][3] = malloc(sizeof(Point) * 6);// 分配数组的数组int n = 2, m = 3;Point **p3 = malloc(sizeof(Point *) * n);for (size_t i = 0; i < n; i++){p3[i] =...
动态规划(dp)
动态规划核心原理重叠子问题在递归分解问题时,相同子问题会被多次重复计算。例如,斐波那契数列中计算 F(5)需要多次计算 F(3),动态规划通过缓存子问题解(如数组或哈希表)避免重复计算 最优子结构问题的最优解可以由其子问题的最优解组合而成。例如,最短路径问题中,从 A 到 B 的最短路径必然包含中间点 C 的最短路径 状态转移方程定义状态之间的关系式,明确如何从子问题推导出当前问题的解。例如,0-1 背包问题的状态转移方程为: dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i]) 实现步骤1.定义状态 2.初始化边界条件 3.推导状态转移方程 4.计算顺序与填表 实现方式1.自底向上迭代(推荐)通过循环逐步填充状态表,适合线性问题。例如,计算斐波那契数列: int fib(int n) { if (n <= 1) return n; int dp[n+1]; dp[0] = 0, dp[1] = 1; for (int i = 2; i <= n; i++) { ...
数据抽象与类
数据抽象与类抽象数据类型1.抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程。 2.抽象的过程在于透过事物的现象获得它的本质,并用概念、原理、规律的形式描述它。 3.抽象的意义在于通过事物的本质,识别或区分事物 类的声明类关键词**class 或 struct 或 union **用 class 定义的类,默认访问权限为private用 struct 定义的结构体,默认访问权限为public 访问说明符• public 公有,表示后续成员是对象使用者可访问 • private 私有,表示后续成员仅对象内部可访问 • protected 受保护 类成员• 数据成员,按声明顺序存储,对齐规则同 C。一般设计中,数据成员需要隐藏保护,需要通过函数成员访问 • 函数成员,公有成员可以被外部使用者访问;私有成员仅内部访问;const 函数成员不能修改数据成员 类关键词 类标识符 { 访问说明符:(可选) 数据成员声明序列; 函数成员声明序列;}; 例: /* DATE.hpp*/class DATE {public:void...
初试C++ 2.0
初学 C++ string 类与操作初识类类是现实世界或抽象世界中概念,是关于同类事物定义的描述 在标准库中有很多类,通过以下类可体验与 C 语言的不同• < string >库中的std::string 类• 输入/输出库中的 std::ifstream, std::ofstream 类 string 类 与 C 风格字符串C 风格字符串的缺点: 1.C 风格字符串是使用 null 字符 ‘\0’ 终止的一维字符数组。因而字符串定义时,必须事先知道保留多大空间存储字符串 2.在字符串操作,如 strcat,时要保证目标字符串有足够的空间 3.使用 malloc 动态空间处理字符串,对一般程序员来说太复杂,非常容易出现BUG 创建 stringstring s1;string s2 = "c++";string s3 = s2;string s4 (5, 's');//s4 初始化为 5 个 s string 对象的运算string...
初试C++ 1.0
初学 C++ io 流–输入/输出操作符标头< iostream >•endl,输出 ‘\n’ 并冲洗输出流。例如:cout << endl; •dec, hex, oct,更改用于整数输入/输出的基数(进制) •left,right, 设置填充字符的布置,即左对齐或右对齐 •fixed,scientific,更改用于浮点 I/O 的格式化 •showpoint,noshowpoint,控制浮点表示是否始终包含小数点 •showpos,noshowpos,控制是否将 + 号与非负数一同使用 标头< iomanip >• setw(n),更改下个输入/输出域的宽度,宽度为 n • setprecision(n),更改浮点精度 代码示例/* iostream-format.cpp */#include<iostream>#include<iomanip>using namespace std;int main() {double myFloat=123.4578;int...