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;
}
相关推荐
闻缺陷则喜何志丹7 小时前
【动态规划】P10726 [GESP202406 八级] 空间跳跃|普及+
c++·算法·动态规划·洛谷
嘻哈baby7 小时前
Go 函数中的参数为什么不支持默认值?
java·开发语言·jvm
一晌小贪欢7 小时前
python-第29天:Python面向对象之多态与抽象类
开发语言·python·数据可视化·面向对象·python办公·python多态
Chester_19997 小时前
CSP202312C.树上搜索
开发语言·数据结构·c++·蓝桥杯·stl
Figo_Cheung8 小时前
Figo共振网络宇宙演化论(RNC) :从原初对称破缺到全息大和谐的演化路径研究
开发语言·php·量子计算
重生之我来学Python8 小时前
Git-SVN 混合开发,从入门到精通!
开发语言·git·svn·github
CoderYanger8 小时前
前端基础——JavaScript(基础语法)(下篇)
java·开发语言·前端·javascript·程序人生·面试·职场和发展
京师20万禁军教头8 小时前
39面向对象(高级)-设计模式
java·开发语言·设计模式
白山编程大哥8 小时前
Java 迭代器接口详解:从 Iterator 到 ListIterator 的完整指南
java·开发语言·windows
见叶之秋8 小时前
【C++】String类的使用(含模拟实现)
java·开发语言·c++