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;
}
相关推荐
weixin_460443561 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
Cc.Y5 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
sm_926787055 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev5 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
by209995 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
笔墨登场说说5 小时前
flink bin/start-cluster.sh 帮我做成开机启动
开发语言·python
Sarvartha5 小时前
Lambda 表达式和函数式接口
java·开发语言
小白学大数据5 小时前
拼多多反爬对抗实战:Scrapy 中间件化采集架构解析
开发语言·scrapy·中间件·架构
colinu5 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
学逆向的6 小时前
win32注入代码
开发语言·网络安全·api·win32