0908 C++标准模板库和异常处理
Part 1.梳理思维导图
Part 2.编程
封装一个学生的类,定义一个学生这样类的vector容器, 里面存放学生对象(至少3个)
再把该容器中的对象,保存到文件中。
再把这些学生从文件中读取出来,放入另一个容器中并且遍历输出该容器里的学生。
#include <iostream>
#include <fstream>
#include <vector>using namespace std;class Stu
{friend ostream& operator<<(ostream& os,const Stu &s);friend istream& operator>>(istream& is,Stu &s);private:string name;int id;string classname;
public:Stu(){}Stu(string name,int id,string classname):name(name),id(id),classname(classname){}virtual ~Stu(){}
};
ostream& operator<<(ostream& os,const Stu &s)
{os << s.name << " " << s.id << " " << s.classname << " " << endl;return os;
}istream& operator>>(istream& is,Stu &s)
{is >> s.name >> s.id >> s.classname;return is;
}
int main()
{vector<Stu> v;Stu s("张三",1,"1001");v.push_back(s);Stu s1("李四",2,"1002");v.push_back(s1);Stu s2("王五",3,"1003");v.push_back(s2);ofstream ofs;ofs.open("E:/QT PROJECT/25061C++/day8 0908/work/Stu.txt",ios::out);for(const auto &x : v){ofs << x;}ofs.close();ifstream ifs;ifs.open("E:/QT PROJECT/25061C++/day8 0908/work/Stu.txt",ios::in);vector<Stu> v2;Stu is;while(ifs >> is)v2.push_back(is);ifs.close();for(const auto &x : v2){cout << x;}return 0;
}
一.C++中的数据类型转换
1.概念
C++存在多种类型,数据类型转换用于在不同数据类型间转换
2.隐式类型转换
C++编译器自动执行的转换,基本在表达式中发生
int num_int = 16;
double num_double = num_int;
3.显式类型转换
a.静态转换static_cast
用于基本类型转换和指针
int num_int = 16;
double num_double = static_cast<double>(num_int);
b.动态转换dynamic_cast
通常用于多态类之间的指针或者引用类转换,在运行是进行类型检查,只能用于具有虚函数的类之间转换
class Base
{virtual void fun(){}
};
class Child:public Base {};Base *base_ptr = new Child;
Child *child_ptr = dynamic_cast<Child *>(base_ptr);
c.常量转换const_cast
用于添加或移除指针或者引用的常量性(const)
const int num_const = 5;
int *num_ptr = const_cast<int *>(&num_const) //去除const限定符
d.重新解释转换reinterpret_cast
执行低级别的位模式转换,通常用于指针间的类型转换
int num = 29;
float *ptr =reinterpret_cast<float *>(&num) ;
二.异常
1.异常的定义
程序运行时发生的不正常事件
2.处理
try: ------->将可能发生异常的地方 用try包裹
throw: ------>将发生异常的地方用throw进行抛出
catch: ------>捕获接受异常
#include <iostream>using namespace std;int fun(int a, int b)
{if(b != 0)return a/b;elsethrow 1;
}int main()
{try{cout << fun(10,0) << endl;} catch (int a){if(a == 1)cout << "分母不能为0" << endl;}return 0;
}
三.C++标准模板库(STL)
1.STL的组成
容器、算法、迭代器
容器:存放数据的
数组、链表、顺序表、、、、
算法:函数--->解决问题 ---->增删改查
迭代器:就是算法和容器的粘合器(==指针)
2.vector容器
vector就是数组,也称为单端数组,和普通数组有区别,普通数组是静态空间,而vector空间时动态拓展的。
动态拓展:不是在原来的空间上续接新的空间,而是重新申请新的空间,将原来空间里的内容,复制到刚刚申请的空间中。
需要包含头文件#include
a.vector的构造函数
vector v; //构造函数
vector(const vector &other); //拷贝构造函数
vector(v.begin(),v.end()) ; //把区间[v.begin(),v.end())的数据拷贝给对象
vector(n,elem); //将n个elem拷贝给对象
b.vector赋值函数
vector &operator=(const vector &v); //拷贝赋值函数
assgin(v.begin(),v.end()) ;//将区间[v.begin(),v.end())赋值给对象
assgin(n,elem); //将n个elem赋值给对象
c.vector的容量大小
empty() //判断容器的是否为空
size() //容器的大小 元素的个数
capacity() //容量
resize() //重新设置大小
d.vector 的插入和删除
push_back() //尾插
pop_back() //尾删
insert(iterator_pos,elem); //在迭代器所指向的位置,插入数据
insert(iterator_pos,n,elem);//在迭代器所指向的位置,插入n个数据
eraser(v.begin(),v.end()) // 把区间的数据删除
clear() //清空
e.元素的访问
at(int index);
operator[] (int index);
front(); //第一个元素
back(); //最后元素
3.set 容器
set是一种包含唯一元素的容器,元素会安装特定的排序方式自动排序。其特点时每个元素只出现一次,排序方式默认是升序排序。
a.操作
插入:insert()
查找: find()
删除: erase()
遍历: 可以通过迭代器遍历set中元素。
4.map 容器
map是一个键值对容器,其中每个元素由一对key和value组成,每个key是唯一的。map会根据key自动排序,排序的方式默认为升序。
a.操作
插入: insert() 插入键值对
查找:find() 用于查找指定的key
删除:erase() 用于删除指定key. 整个键值对都删
访问值: 可以通过[]操作符 或者 at() 访问值