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;
}
相关推荐
张飞飞飞飞飞1 小时前
python——Nuitka打包
开发语言·python
躲在云朵里`2 小时前
Jeecgboot框架-权限控制
java·开发语言
Mr YiRan2 小时前
C++二义性,多态,纯虚函数和模版函数
java·jvm·c++
闻缺陷则喜何志丹2 小时前
P8153 「PMOI-5」送分题/Yet Another Easy Strings Merging|普及+
c++·数学·算法·洛谷
tankeven2 小时前
HJ102 字符统计
c++·算法
江西理工大学小杨2 小时前
高性能 C++ 社交平台1:微服务架构设计
开发语言·c++·微服务
lihao lihao2 小时前
接口自动化测试—request模块
开发语言·python
YxVoyager2 小时前
在VS2017中使用Qt的foreach宏,IntelliSense无法正确识别函数定义
c++·qt
Coisinilove2 小时前
MATLAB微分方程求解
开发语言·matlab·微分方程