尝尝常九

一名计算机科学与技术的大学生,想要去探索这个世界

最近文章👇

  • 标题二

  • C++基础语法

    引用

    引用相当于变量的别名。声明一个引用时,必须对其进行初始化,即声明它代表的是哪一个变量。在声明一个变量后,不能再将其声明为另一个引用了。可以取引用的地址,它的地址将会和它引用的变量的地址一样。

    函数模板

    有时候可能相通名称的函数需要作用于多种类型的变量,使用函数模板来达到这一效果,在函数的上一行使用关键字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>头文件
    • 矩阵法求定积分 – 中点矩阵法,辛普森法,高斯-勒让德求积
    • 椭圆积分法