引用
引用相当于变量的别名。声明一个引用时,必须对其进行初始化,即声明它代表的是哪一个变量。在声明一个变量后,不能再将其声明为另一个引用了。可以取引用的地址,它的地址将会和它引用的变量的地址一样。
函数模板
有时候可能相通名称的函数需要作用于多种类型的变量,使用函数模板来达到这一效果,在函数的上一行使用关键字template<typename T>来将此函数声明为模板函数
template<typename T>
T max(T a,T b,T c){
T result;
if(a>b)
result = a
else
result = b
if (result > c)
return result;
else
return c;
}
内部函数和外部函数
根据函数是否能被本文件外的其它文件所调用,可以分为内部函数和外部函数,内部函数使用关键字static描述,外部函数使用extern描述,关键字写到最左冠
面向对象程序设计的四个特点
抽象,封装,继承,多态性
类
构造函数、析构函数
类中的静态成员变量需要在类外进行声明
运算符重载
- 重载
[]运算符
operator[](){
}
重载运算符
重载<<到cout,cout是ostream的
友元
在类中使用friend将成员函数或类声明为友元函数或类,友元可以访问私有成员函数或变量
异常
包含头文件 #include <cstdlib> 函数 abort() 返回一个随实现而异的值,调用该函数将直接终止程序
try{
}catch(){
}
C++头文件探索
char* getenv(const char* env_name) 该函数由<cstdlib> 头文件提供,作用是用来获得相应的环境变量
智能指针
#include <memory> 包含库
auto_ptr<type> ptr(new type)
unique_ptr<type> ptr(new type)
shared_ptr<type> ptr(new type)
make_unique<Class>(constructor_arr)
//使用方法
#include <memory>
#include <string>
int main(){
std::auto_ptr<string> str(std::string); // 创建一个string类型的对象指针,str为名称
return 0;
}
所有智能指针类都有一个
explicit()构造函数,它将指针作为参数。不会自动将指针转换为智能指针类
例:ptr_class 是一个智能指针类,ptr_nor是一个指针
//正确使用方法:
ptr_class = shared_ptr<type> (ptr_nor);
shared_ptr<type>ptr_class(ptr_nor);
//错误使用方法:
ptr_class = ptr_nor;
shared_ptr<type> ptr_class = ptr_nor;
注意事项
禁止将智能指针指向栈内存。因为当智能指针指向栈内存,过期时,它将释放栈内存的数据!这是错误!
避免将两个智能指针指向一个数据,因为这将导致同一个数据被释放两次。
两个auto_ptr指针对象,给ptr1复制,再执行语句ptr2=ptr1,这将使 ptr1指向的数据转交给ptr2,ptr1不再指向数据。auto_ptr和unique_ptr都采用所有权模型,但unique_ptr要优于auto_ptr 而使用shared_ptr指针对象将引用计数+1,这就可以使多个指针指向一个数据,释放指针时只有当计数归零时才释放数据占用的内存,不为0时只将指针对象删除,并且引用计数-1
unique_ptr允许将一个临时的unique_ptr进行赋值 不要将一个unique_ptr指针复制给另一个unique_ptr指针,这将导致程序在编译时发生错误,需要使用标准库中的std::move()函数进行赋值 pt = std::move(ps) pt和ps均为智能指针 可以将unique_ptr指针存入STL容器中,只要不调用类似sort() 这种会交换位置的函数,否则就会出错
如何选择智能指针
要使用多个指向同一个对象的指针时。应选择shared_ptr
C++标准时间库
系统时钟 system_clock 稳定时钟 steady_clock 高分辨率时钟 high_resolution_clock 三个时钟都有 now() 函数
时间点 time_point 时间段 duration
稳定时钟 steady_clock
std::chrono::steay_clock::now() 返回当前时间,返回类型为std::chrono::time_point
对时间段使用泛型编程 需要填写精度 int or double
Lambda表达式
//Lambda 函数形式
[captures](){};
captures 捕获列表
| 符号 | 描述 |
|---|---|
| [] | 不进行任何捕获 |
| [&] | 按引用的形式捕获所有 |
| [=] | 按值的形式捕获所有 |
| [=,&a] | 除了 a使用引用外,其它使用按值传递 |
| [&,a] | 除了a使用按值传递外,其它使用按引用传递 |
多线程
多线程并发指的是在同一个进程中执行多个线程。
包含头文件#include<thread>
创建一个线程std::thread my_thread;
两种启动的线程: thread.detach() 启动线程后,主线程会继续向下执行代码 thread.join() 等待线程结束后程序才会继续向下执行
this_thread 类
mutex
包含头文件 #include <mutex> 互斥量: std::mutex; //基本Mutrex类 常用操作 lock() 资源上锁 unlock() 资源解锁 trylock() 查看是否上锁 同一个线程已经对它上锁,将会产生死锁
死锁:两个或以上的进程因竞争资源或彼此通信而导致的阻塞
std::recursive_mutex; //递归Mutex类 std::time_mutex; //定时Mutex类 std::recursive_timed_mutex //定时递归Mutex类
STL
标准库 由6部分组成
algorithm 算法 containers 容器 iterator 迭代器 分配器
算法
sort()排序算法需要容器支持随机访问
Vector 向量
queue 队列
从尾部插入数据,从首位取数据
deque 双端队列
可以从首和尾插入和删除数据
stack 栈
只能从头部进入和删除
待看
- 学习<functional> 头文件中的内容
- 学习<cmath>头文件
- 矩阵法求定积分 – 中点矩阵法,辛普森法,高斯-勒让德求积
- 椭圆积分法
