1.auto
1.1 概念
C++11引入了自动类型推导,和Python不一样,C++中需要auto关键字引导。
1.2 作用
auto修饰变量时,可以自动推导出变量的数据类型
1.3 注意
1> auto修饰变量时,必须初始化
2> auto的右值,可以是右值,可以是表达式,也可以是函数的返回值
3> auto不能修饰函数的形参
4> auto不能修饰数组
5> auto不能修饰非静态数据成员
1.4 用途
1> auto 一般修饰数据类型表冗长的类型。
2> auto还可以修饰依赖模板参数的类型
3> auto可以修饰lambda表达式。
2.lambda表达式 (C++11)
2.1 作用
当需要一个匿名的,临时的,可以捕获外界变量的函数时,可以用lambda表达式完成。
2.2 格式
[](){} //lambda表达式
//auto fun = [a,b]()mutable{ //对a,b进行值捕获
//auto fun = [=]()mutable{ //对外界所有的变量进行值捕获
//auto fun = [&a,&b](){ //对a,b进行引用捕获
auto fun = [&](){ //对外界所有的变量进行引用捕获
cout << "a = " << a << " &a = " << &a << endl;
a = 200;
cout << "a = " << a << " &a = " << &a << endl;
cout << b << endl;
};
fun();
3.C++中的数据类型转换
3.1 概念
C++中存在多种数据类型的转换方式,用于在不同的数据类型之间进行转换。
3.2 种类
1>隐式类型转换(自动类型转换)
2>显示类型转换(强制类型转换)
3> C风格类型转换
3.3 注意
需要注意的是,尽管C++提供了多种类型转换方式,但应该谨慎使用,以避免潜在的错误和问题。特别是在使用强制类型转换时,务必确保转换操作是安全的,以避免不必要的问题。
4.异常
可以优雅解决代码中的异常
try ------> 将可能发生异常的地方用try进行包裹
throw ------> 将发生异常的地方,使用throw进行抛出异常
catch ------> 使用catch接收异常
5.C++标准模板库 (STL)
C++中的标准模板库 (Standard Template Library),STL是标准库之一。
标准模板库中提供大量的函数模板和类模板,用来对数据结构的处理。
STL 的组成:容器、算法、迭代器
容器:置物之所也
数组、链表、二叉树、哈希、、
算法:问题之解法也
增、删、改、查
迭代器:是容器和算法之间的粘合剂 (== 指针)
5.1 vector 容器
vector就是数组,也称为单端数组,和普通数组有区别,普通数组是静态空间,而vector的空间时动态拓展。
动态拓展,不是在原来空间后面续接新的空间,而是,重新申请空间,将原来空间里的数据,复制到刚刚申请的空间中,再释放原来的空间。
5.2 vector构造函数
函数原型:
vector< T > v; //无参构造
vector(const vectcor &v) ; //拷贝构造函数
vector(n,elem); //将n个elem拷贝给对象本身
vector(v.begin(),v.end()); //将区间[v.begin(),v.end())拷贝给对象本身
5.3 vector赋值函数
函数原型:
vector &operator=(const vector &v); //拷贝赋值函数
assgin(v.begin(),v.end()); //将区间[v.begin(),v.end())赋值给对象本身
assgin(n,elem); //将n个elem赋值给对象本身
5.4 vector的容量大小
empty() ; //判读容器是否为空
size(); //容器的大小,元素的个数
capacity(); // 容量的大小
resize(); //重新设置大小
5.5 vector的插入和删除
push_back(); //尾插
pop_back(); //尾删
insert(iterator_pos, elem); //在迭代器所指向的位置插入数据
insert(iterator_pos, n,elem);//在迭代器所指向的位置插入n个数据
eraser(v.begin(),v.end()); //将区间[v.begin(),v.end())的元素删除
clear(); //清空
6.list
7.智能指针
7.1引入背景
1> C++中在堆区申请空间和释放空间需要使用new和delete完成
2> 多个指针指向同一个内存空间,释放其中一个的空间,另一个还在继续使用 (悬空指针)
3> 只是申请了内存空间,使用后忘记释放内存空间,堆区对象没有得到析构
4> 栈取申请的对象空间,在脱离对象空间后,会自动调用析构函数完成资源的回 收,但是堆区的不会自动释放
5> 总结:上述例子中,在堆区申请一个对象空间,但是没有手动释放空间,造成 对象没有析构,为了保证堆区空间使用的安全性,我们引入了智能指针,目的是更加 安全的使用堆区空间。
7.2类型
1> C++11标准提供了两种智能指针,分别是unique_ptr(独占智能指针)、 shared_ptr(共享智能指针)
2> 除了上述两种指针外,还有auto_ptr(自动智能指针,已弃用)、weak_ptr (弱智能指针,辅助shared_ptr作用)
3> 以上所有智能指针都在头文件:#include <memory>中
4> 智能指针是类模板,在栈区创建智能指针对象
5> 把普通指针交给智能指针管理
6> 智能指针对象过期时,析构函数会自动释放智能指针管理的指针空间