C++
文章平均质量分 51
郑文博Coding
人的一生中最光辉的一天,并非是功成名就那天,而是从悲叹与绝望中产生对人生的挑战,以勇敢迈向意志的那天。
展开
-
用QT自带的QMediaPlayer写一个音乐播放器
直接上代码头文件#pragma once#include <QObject>class QMediaPlayer;class QMediaPlaylist;#define SfPlayer MusicPlayer::GetInstance()class MusicPlayer : public QObject{ Q_OBJECTprivate: MusicPlayer(QObject *parent = nullptr);public: ~MusicPlaye原创 2022-01-26 17:31:28 · 843 阅读 · 0 评论 -
写一个QTAV的音乐播放器
关于QTAV的介绍和编译请看我之前的文章,直接上代码因为音乐播放器只有一个所以是个单例头文件:#pragma once#include <QObject>#include <QtAV/AVPlayer.h>#include <QtAVWidgets/GLWidgetRenderer2.h>using namespace QtAV;#define avplayer QtavPlayer::getInstance()class QtavPlayer :原创 2022-01-26 17:27:31 · 2246 阅读 · 0 评论 -
C语言 strcpy和memcpy源码实现
一、memcpy三个函数在使用过程中,均需包含以下头文件://在C中#include <string.h>//在C++中#include <cstring>二、memcpy函数是C/C++中的内存拷贝函数,它的功能是从源src所指的内存地址的起始位置开始,拷贝n个字节到目标dst所指的内存地址的起始位置中。实现如下: void* memcpy(void *dst,const void *src,size_t count) { void* ret = dst原创 2021-11-29 10:52:35 · 2494 阅读 · 0 评论 -
C++智能指针 shared_ptr
为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer)。智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈上的变量自动被销毁,智能指针内部保存的内存也就被释放掉了(除非将智能指针保存起来)。C++11提供了三种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用时需添加头文件。shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的原创 2021-11-08 14:47:16 · 190 阅读 · 0 评论 -
C++ 四种类型转换
众所周知C++关于类型转换引入了四种方式:1、static_cast2、const_cast3、dynamic_cast4、reinterpret_cast1、为什么要引入这几种类型转换,它与C语言中的强制类型转换有什么区别?2、这四种类型转换分别应用在什么场景?我们都知道C++完全兼容C语言,C语言的转换方式很简单,可以在任意类型之间转换,但这也恰恰是缺点,因为极其不安全,可能不经意间将指向const对象的指针转换成非const对象的指针,可能将基类对象指针转成了派生类对象的指针,这种转换很转载 2021-04-14 19:50:59 · 171 阅读 · 0 评论 -
C++ 友元类和友元函数详解
私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦。C++ 是从结构化的C语言发展而来的,需要照顾结构化设计程序员的习惯,所以在对私有成员可访问范围的问题上不可限制太死。C++ 设计者认为, 如果有的程序员真的非常怕麻烦,就是想在类的成员函数外部直接访问对象的私有成员,那还是做一点妥协以满足他们的愿望为好,这也算是眼前利益和长远利益的折中。因此,C++ 就有了友元(fr转载 2021-03-31 15:42:16 · 359 阅读 · 0 评论 -
C++ 虚继承详解
多继承(Multiple Inheritance)是指从多个直接基类中产生派生类的能力,多继承的派生类继承了所有父类的成员。尽管概念上非常简单,但是多个基类的相互交织可能会带来错综复杂的设计问题,命名冲突就是不可回避的一个。多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示:类 A 派生出类 B 和类 C,类 D 继承自类 B 和类 C,这个时候类 A 中的成员变量和成员函数继承到类 D 中变成了两份,原创 2021-02-08 13:54:37 · 2540 阅读 · 3 评论 -
OBS源码分析(九)-窗口视频预览
最近接了个需求,要在源列表的每个源进行视频预览类似如下图:一、OBS所有的视频预览包括主窗口的预览都是继承OBSQTDisplay这个类。在SourceTreeItem构造函数中添加以下代码 // 预览窗口 play = new OBSQTDisplay(); play->setFixedWidth(100); auto addDrawCallback = [this]() { obs_display_add_draw_callback(play->GetDisplay(),原创 2021-02-02 10:27:49 · 1766 阅读 · 5 评论 -
c++ 11 lambda表达式
lambda的申明方式Lambda表达式是c++11的新特性,它允许程序员在函数内部创建一个匿名函数,对于一些小型的功能模块,可以使用lambda表达式来实现。很多其他语言已经有了lambda表达式,比如objective-c中block就类似。Lambda表达式的声明方式:例如:auto fadd = [](int a, int b){ return a + b;};Fadd就是一个匿名函数,后面是它的实现,auto是自动类型,也是c++11新加入的特性,auto可以自动判断.原创 2021-02-01 16:02:12 · 181 阅读 · 3 评论 -
C++ 11智能指针-unique_ptr
一、前言c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最后的delete语句就返回了,如果我们不在每一个可能跳转或者返回的语句前释放资源,就会造成内存泄露。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源二、应用unique_ptr 由 C++11 引入,旨在替代不安全的 auto_ptr原创 2021-01-11 18:11:35 · 265 阅读 · 0 评论 -
C++ 线程同步---信号量
最近一直在学习OBS源码,遇到很多多线程的知识,也算是恶补了一下之前没搞明白一直没机会用的信号量。一、相关的函数和头文件介绍//头文件#include <windows.h>//创建信号量APIHANDLE WINAPI CreateSemaphore( _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,//指向SECURITY_ATTRIBUTES的指针; _In_ LONG lI原创 2021-01-07 17:02:31 · 346 阅读 · 1 评论 -
C++ 11新特性nullptr和NULL的区别
nullptr是c++11中的关键字,表示空指针要区分nullptr和NULL,首先要明白NULL的含义:NULL是一个宏定义,在c和c++中的定义不同,c中NULL为(void*)0,而c++中NULL为整数0//C语言中NULL定义#define NULL (void*)0 //c语言中NULL为void类型的指针,但允许将NULL定义为0//c++中NULL的定义#ifndef NULL#ifdef _cpluscplus原创 2021-01-07 15:17:54 · 258 阅读 · 1 评论 -
C语言如何支持面向对象编程
一、函数指针函数指针是个普通的指针,但是写法略不同于一般的指针,二、如何定义函数在结构体外定义,例如:// 原函数int add(int a, int b) {return a + b;}定义函数指针,例如:// 指向原函数的函数指针int (*p)(int x, int y);可以看到,关键字: 1. 返回值类型必须相同 2. 指针变量名要用()括起来 3. 除形参名外,参数列表必须相同赋值,将指针指向函数(不要忘了这一步)// 直接将函数名赋值给指针// 函数名就原创 2021-01-06 13:49:57 · 431 阅读 · 1 评论 -
C++ 函数指针与回调函数
最近在研究OBS源码在源码中作者大量应用了函数指针和回调函数的这种方式,这种方式代码的可读性和效率有了很大的提高。一、函数指针的介绍函数指针:指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两原创 2020-12-31 14:48:52 · 286 阅读 · 2 评论