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;
}
相关推荐
x_x-F7 分钟前
网络数据从网卡到用户态:一场基于内存所有权转移的接力赛
开发语言·网络·php
名字还没想好☜17 分钟前
Java 线上内存泄漏排查实战:jmap 导堆、MAT 找 GC Roots 与四类常见泄漏
java·开发语言·jvm·内存泄漏
码匠许师傅24 分钟前
【C++ 面试真题】聊聊 C++ 的多继承与虚继承
开发语言·c++·面试
我不是疯子是傻子1 小时前
Qt CAN通信周期发送抖动?实测定时器精度校准与时间戳补偿方案
开发语言·数据库·qt
IT爱学堂2 小时前
尚硅谷 - 2025年3月Java+AI大模型应用开发
java·开发语言·人工智能
有点。2 小时前
C++认识数
开发语言·c++
2023自学中2 小时前
Qt 简易聊天室(第二篇),单线程 改为 多线程,方便后续增加文件传输功能
c++·qt
W_326003 小时前
Python文件进阶:一维数据与 CSV 文件读写
开发语言·python
Tyler_TXZ3 小时前
C++C语言之——二叉树
c语言·开发语言·数据结构·c++·二叉树
有点。4 小时前
C++二叉树二(练习题)
数据结构·c++·算法·图论