C++重要知识点相关代码

多态

1、拿基类的指针,实际执行派生类的对象;用基类的指针执行派生类的函数,实际执行的是字子类的执行覆盖版本,而不是基类中的原始版本,称为"多态"

2、虚函数:允许覆盖;实现原理是通过虚函数表,执行时才知道是执行派生类的方法还是基类的方法;

3、纯虚函数,类也变成了抽象类,不能直接实例化

4、虚析构函数可以帮助先执行子类的析构函数,再执行父类的析构函数,否则只执行父类的析构函数,不执行派生类的析构函数

5、LOG(INFO) << "typeid:" << typeid(e).name(); // 查看是什么类型

6、pb = dynamic_cast<Base*>(&d); // 向上转换,派生类向基类转化

7、深拷贝就是给指针重新指向一块地址,避免一块内存被释放2次;

8、互斥锁的使用

c++ 复制代码
#include <pthread.h>
#include <sched.h>
pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&gmutex.g_mutex);
pthread_mutex_unlock(&gmutex.g_mutex);

9、条件变量的使用

c++ 复制代码
// 条件变量主要用于生产者和消费者问题
// 必要性:为了实现等待某个资源,让线程休眠,提高运行效率
// 如果使用死循环,效率较低
// 要和互斥量一起使用
#include <pthread.h>
#include <sched.h>
pthread_cond_t has_cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;


void *product2(void *arg)
{
    LOG(INFO) << "product2";
    int i = 0;
    while (1) // 不停的生成
    {
        pthread_mutex_lock(&lock);
        a.push_back(i);
        LOG(INFO) << "push value:" << i;
        i = i+1;
        LOG(INFO) << "发送single" ;
        pthread_cond_signal(&has_cond);
        pthread_mutex_unlock(&lock);
        usleep(1000000);
    }
    return nullptr;
}


void *saler2(void *arg)
{
    LOG(INFO) << "saler";
    while (1)
    {
        pthread_mutex_lock(&lock);
        // 如果a是空的,就一直等待信号
        if (a.empty())
        {
            LOG(INFO) << "等待single" ;
            pthread_cond_wait(&has_cond, &lock);
            LOG(INFO) << "等待single finish" ;
        }
        LOG(INFO) << "id:" << pthread_self() << "value:" << a[0];
        a.erase(a.begin());
        pthread_mutex_unlock(&lock);
        usleep(1000000);
    }
    return nullptr;
}


int main()
{
    pthread_t tid1, tid2;

    // 生产者
    // pthread_create(&tid1, NULL, product2, NULL);
    // 消费者
    pthread_create(&tid2, NULL, saler2, NULL);
    usleep(1000);
    pthread_create(&tid1, NULL, product2, NULL);

    pthread_join(tid1,nullptr);
    pthread_join(tid2,nullptr);

    return 0;
}

单例模式:就是返回静态成员变量

模版就是就是显示指定类型

python 复制代码
Person<double>* obj = new Person<double>(12.3);

回调函数:就是将函数名当参数传给另一个函数

c++ 复制代码
// 函数指针
#include <stdio.h>
#include <glog/logging.h>

void print_hello()
{
    LOG(INFO) << "hello world";
}

typedef void (* pType)();

void print_hello_ptr(void (* p)())
{
    p();
    LOG(INFO) << "finish";
}

int main()
{
    // pType p;
    // p = print_hello;
    // p();
    print_hello_ptr(print_hello);

    return 0;
}
相关推荐
浅时光_c7 小时前
9 循环语句
c语言·开发语言
stevenzqzq7 小时前
Kotlin 协程:withContext 与 async 核心区别与使用场景
android·开发语言·kotlin
CDN3607 小时前
弱网下游戏盾掉线重连失败?链路保活与超时参数优化
开发语言·游戏·php
im_AMBER7 小时前
Leetcode 153 课程表 | 腐烂的橘子
开发语言·算法·leetcode·深度优先·图搜索
paeamecium7 小时前
【PAT甲级真题】- Reversing Linked List (25)
数据结构·c++·算法·pat
烈风7 小时前
01_Tauri环境搭建
开发语言·前端·后端
cch89187 小时前
PHP爬虫框架大比拼
开发语言·爬虫·php
TTTrees7 小时前
C++学习笔记(38):封装、继承、多态
c++
l1t7 小时前
DeepSeek辅助编写的dmp转schema和csv文件c语言程序
c语言·开发语言·windows
6Hzlia7 小时前
【Hot 100 刷题计划】 LeetCode 54. 螺旋矩阵 | C++ 模拟法题解
c++·leetcode·矩阵