游戏开发C++基础
文章平均质量分 51
该栏主要是展示博主日常关于C++的所学知识以及见解,仅供参考。
ufgnix0802
这个作者很懒,什么都没留下…
展开
-
C++ 内存分配接口
在我们日常开发中,调试阶段最关注的问题便是对内存管理,防止内存泄露。故在此特意封装内存分配接口,用于调试阶段管理内存。原创 2023-01-09 19:28:49 · 228 阅读 · 0 评论 -
std::string底层原理分析
std::string作为我们经常使用的一种STL容器,我们是否某个时刻有想过它的底层到底是如何实现的?其实在std::string的历史中,出现过几种不同的方式。可以从一个简单的问题来弹错,一个std::string对象占据的内存空间有多大?即sizeof(std::string)的值为多大?如果我们在不同的编译器(VC++、GNU、Clang++)上去测试,可能会发现其值是不同的;即使是GNU,不同的版本,获取的值也不同。转载 2022-12-27 16:49:11 · 953 阅读 · 1 评论 -
std::bind原理分析
本文解释std::bind如何工作的。在图中会对一些语法进行简化(例如,省略函数调用操作符的参数类型等),并简化std::bind的实现。转载 2022-12-27 16:45:33 · 721 阅读 · 0 评论 -
C++外部执行类的私有函数
C++语法规定类外是不能访问类内部的私有函数的,那么当我们封装一个类的时候是用于给其他人使用的,那么务必会有类的接口要清爽干净的需求,也就是内部使用的函数也不能为一个共有函数,而是必须为一个私有函数。这样当其他人在使用的时候,看到我们类的共有接口便是其都可使用的接口。以下IdleTest类中的Update为一个私有方法,我们需要将这个函数赋予一个void*类型的指针,即函数指针转换为void*指针。下面使用一个Libuv中的测试单例(该单例不是标准单例格式,仅供演示)进行演示...原创 2022-11-27 20:37:52 · 665 阅读 · 0 评论 -
EventSystem(事件派发-观察者模式)
可自定义主题(结构体),对应观察者事件可以通过订阅主题收到发布者消息,同时该主题也作为消息结构传入发布者事件中。原创 2022-11-13 22:04:12 · 189 阅读 · 0 评论 -
C++ Log日志进阶
下面进阶版,将原本的全局日志方法封装为类,通过运算符重载来使用日志,更加便捷。原创 2022-10-31 20:58:28 · 482 阅读 · 0 评论 -
C++ 引用的数组和数组的引用
这两者的关系有点像指针数组和数组指针,其中指针数组可以简单地说就是数组中的元素为指针,而数组指针简单地说就是。而类比,引用的数组就是,而数组的引用就是一个指向数组的指针。原创 2022-10-28 21:28:01 · 822 阅读 · 0 评论 -
C++ 如何让抽象类被继承时触发某个方法从而达到注册的效果?
在我们项目开发过程中,会有很多不同的需求,那么针对标题需求,我们应当怎么实现?原创 2022-10-22 21:25:38 · 223 阅读 · 0 评论 -
C++ for auto用法以及map利用迭代器赋值
for auto有两种用法,一种是可以改变迭代对象的值,一种是不可以改变迭代对象的值。原创 2022-10-22 21:23:22 · 6426 阅读 · 0 评论 -
C++ Log日志
在我们平常使用C++开发项目的过程中,报错信息能使用如那么每当我们在不同的环境下就要使用不同的日志接口去处理是否会觉得比较麻烦?故博主基于一定的思维,建立起简单的Log接口用于规范日志信息。原创 2022-10-22 21:20:49 · 684 阅读 · 0 评论 -
C++ new的三种用法
三种用法包括:plain new、nothrow new、placement new。顾名思义就是最普通的new的使用,在C++中...原创 2022-10-15 22:24:25 · 1383 阅读 · 0 评论 -
C++ 事件分发器
事件分发器用于动态的注册事件,隐藏底层细节,只需专注逻辑开发即可。原创 2022-10-14 21:48:06 · 612 阅读 · 0 评论 -
C++ =delete的使用
如果类中不需要拷贝/移动操作,可以显式通过在public域中(private本身就是不能显式的直接调用的)使用 =delete 或其他手段禁用之;原创 2022-10-12 22:16:26 · 1169 阅读 · 0 评论 -
C++ 断言函数
断言(assertion)是编程中的一种常用手段,在通常情况下,断言就是将一个返回值总是真(或者我们需要真)的判别式放在语句中,用以排除在设计逻辑上不应该出现的情况。举个例子:我们都知道除数不能为0,那么就可以对除数使用断言,让程序在除数为0的情况下异常退出。= 0);//返回为真,则正常执行下去;否则异常退出且有错误提示。通常来说,断言并不是正常程序所必需的,但对于程序调试来说,通常断言就够帮助开发者快速定位那些违反某些前提条件的程序错误。原创 2022-10-12 22:14:33 · 684 阅读 · 0 评论 -
volatile关键字及C++数据类型转换
volatile关键字及C++数据类型转换volatile关键字参考链接:https://blog.csdn.net/jokerro/article/details/107734379 volatile关键字在C/C++中与const同级用来修饰变量,用它声明的变量可以被某些编译器中未知的因素修改,如操作系统、硬件、其它线程等。遇到这个关键字声明的变量,编译器就不再对其进行优化,当使用volatile声明变量的时候,系统总是从它所在的内存空间直接读取数据,而一般情况下,编译器会对代码进行优化。在原创 2022-05-25 22:00:56 · 447 阅读 · 0 评论 -
C++构造函数、析构函数与抛出异常
C++构造函数、析构函数与抛出异常参考文章:https://www.cnblogs.com/hellogiser/p/constructor-destructor-exceptions.html 无论何时,从构造函数中抛出异常都是可以的。动态创建对象要进行两个操作:分配内存和调用构造函数。若在分配内存时出错,会抛出bad_alloc异常;若在调用构造函数初始化时出错,会不会存在内存泄漏呢?答案是不会。因为new运算符保证不会出现内存泄漏。如下面代码:T *p = new T;被编译器转换后原创 2022-04-13 17:23:55 · 499 阅读 · 0 评论 -
C++智能指针的实现与使用(详解)
C++智能指针的实现与使用(详解)智能指针介绍缘起C++指针的实际问题分配内存忘记释放,导致内存泄漏有指针引用时释放内存,导致其它指针非法访问异常一些对象的声明周期难以明确办法首先重载运算符*、->、[]、=使得一个类具有指针的操作其次,使用模板编程,使得一个模板类可以接入各种类型最后,自己管理内存。使用方法get、swap、unique、use_count、reset、make_shared(模板方法)注意事项智能指针不是线程安全的。#include <ios原创 2022-04-05 20:59:14 · 3470 阅读 · 0 评论 -
C++11中的std::function和std::bind
C++11中的std::function和std::bind一、可调用对象可调用对象有以下几种定义:是一个函数指针。是一个具有operator()(运算符重载)成员函数的类对象可被转换成函数指针的类对象一个类成员函数指针 C++中可调用对象虽然都有一个比较统一的操作形式,但是定义方法五花八门,这样就导致使用统一的方式保存可调用对象或者传递可调用对象时,会十分繁琐。C++11中提供了std::function和std::bind统一了可调用对象的各种操作。不同的类型可能具有相同的调用形式原创 2021-11-22 22:02:45 · 951 阅读 · 0 评论 -
明显调用的表达式前的括号必须具有(指针)函数类型
明显调用的表达式前的括号必须具有(指针)函数类型在C语言中函数二级指针的调用//基础基类typedef struct tagBase{ int x; int y; int type; const char* name; SAVECB saveCb;//存储回调函数 FCOLLISIONCB callback;//碰撞回调函数}TBase, *PTBase;typedef PTBase(*FCREATEINITCB)(int x, int y, struct tagBroad* pB原创 2021-10-07 11:07:37 · 26532 阅读 · 1 评论 -
游戏开发之C++IO流(C++基础)
游戏开发之C++IO流(C++基础)头文件fstream:1.文本文件#include <iostream>#include <fstream>//C++IO流头文件using std::cout;using std::endl;using std::cin;int main(){ //文本文件读写 //std::ifstream //输入流 //std::ofstream //输出流 //std::fstream //输入输出流 std::fst原创 2021-10-07 10:54:05 · 252 阅读 · 0 评论 -
游戏开发之魔塔游戏分析
游戏开发之魔塔游戏分析原创 2021-10-07 09:36:22 · 904 阅读 · 0 评论 -
游戏开发之C++异常(C++)
游戏开发之C++异常(C++)1.异常的基础概念异常处理就是处理程序中的错误。所谓错误就是指程序运行过程中发生的一些错误。如:除0溢出、数组下标越界、所要读取的文件不存在、空指针、野指针、内存不足等。TIPS:异常在C++的项目实例中一般不推荐使用。2.异常在C++中的语法 try { throw 数据;//抛出异常 } catch(数据类型 变量名)//根据数据类型捕获异常 {} catch(...)//...表示可捕获任意类型的异常 {}3.异常的使用3.1 整型异原创 2021-09-15 15:15:55 · 673 阅读 · 0 评论 -
游戏开发之C++指针的妙用(C++)
游戏开发之C++智能指针(C++)TIPS:智能指针只是博主按照自己的理解进行描述的,C++语法中并没有说明智能指针。1.原理以下有一个类对象,请思考如何编写其访问方式。 //Z代表class Z,且Z类是一个模板类 Z<int> a; a->t = 200;a代表Z类的对象,但是注意a不是一个Z类指针且t为Z类内部的整型成员变量。首先肯定考虑使用->的运算符重载进行重载。代码如下: template<class T> class Z { pu原创 2021-09-15 10:56:46 · 270 阅读 · 0 评论 -
游戏开发之C++类和对象相关概念实例(C++)
游戏开发之C++类和对象相关概念实例(C++)‘问题:有一个电视类,功能: 开关机状态、音量、频道(电视机只能一次调一个频道、只能调整频道 )。遥控器类:拥有电视机类的所有功能,可以调整至指定频道。具体实现如下:#include <iostream>namespace{ //电视类 class Television { friend class RomoteControl; friend std::istream& operator>>(s原创 2021-09-14 20:16:18 · 211 阅读 · 0 评论 -
游戏开发之初识C++模板(C++基础)
游戏开发之C++模板(C++基础)1.C++中,模板 == 泛型。2.模板意味预制体,属于多态中的静态动态(编译时多态)。3.模板,编译器在编译的时候会生成正在的代码。1.函数模板语法:template<class 模板名称> 或者 template<typename 模板名称>数据类型 函数名(模板名称,模板名称,模板名称...){函数体}1.1 函数的形参是模板 #include <iostream> //取消std命名空间内部分成员的命名空原创 2021-09-08 01:47:51 · 269 阅读 · 0 评论 -
游戏开发之STL库的基础使用(string、vector、list、map、unordered_map)(C++基础)
游戏开发之STL库的基础使用(string、vector、list、map、unordered_map)(C++基础)TIPS:程序 = 数据结构 + 算法 + 需求。1.string #include <iostream> #include <string> //C++字符串库 int main() { std::string str; str = "hello"; std::string::iterator begin = str.begin();原创 2021-09-08 01:11:48 · 418 阅读 · 0 评论 -
游戏开发之nullptr和的NULL的区别(C++基础)
游戏开发之nullptr和的NULL的区别(C++基础)知识来源地【点击跳转】在C语言中,NULL是一个宏。值为一个空指针常量类型且C语言中规定常数0和(void*)0都是空指针常量。在C++中,nullptr是一个关键字。值为空指针常量类型且C++中规定(不考虑C++11),常数0是空指针常量,而(void*)0不是空指针常量。...原创 2021-08-31 21:31:17 · 105 阅读 · 0 评论 -
游戏开发之类实现String及其迭代器(C++基础)
游戏开发之类实现String及其迭代器(C++基础)1.数据结构及实现#include <iostream>class String{ friend std::ostream& operator<<(std::ostream& ouput, const String& string);//友元函数private: char* _pArr;//记录动态字符串头 int _nLen;//当前字符串长度 int _nMaxLen;//临时最大字符串原创 2021-08-31 21:17:36 · 212 阅读 · 0 评论 -
游戏开发之C++Vector动态数组及其迭代器的实现--简单版(C++基础)
游戏开发之C++Vector动态数组及其迭代器的实现–简单版(C++基础)1.数据结构及其实现如下:#include <iostream>#include <functional>typedef void* PVOID;class CPPVector{private: PVOID *_pArr;//记录数据的地址 int _len;//当前动态数组长度 int _lenMax;//动态数据临时最大长度public: //初始化动态数组 CPPVector(原创 2021-08-31 21:10:38 · 324 阅读 · 0 评论 -
游戏开发之使用类封装双链表数据结构及双链表迭代器--第二版(C++基础)
游戏开发之使用类封装双链表数据结构及双链表迭代器–第二版(C++基础)1.数据结构及其实现如下#include <iostream>//双链表及其迭代器class List{private: //外部无法访问Node子类 class Node { public: Node *_front;//前驱节点 Node *_next;//后继节点 int _v;//数据 }; Node* _pBegin;//记录头节点的前一个节点 Node* _pEnd;//记原创 2021-08-31 21:02:49 · 159 阅读 · 0 评论 -
游戏开发之使用类封装双链表数据结构及双链表迭代器初版(C++基础)
游戏开发之使用类封装双链表数据结构及双链表迭代器实现初版(C++基础)1.数据结构及实现如下#include <iostream>#include <functional>//避免二义性typedef void* PVOID;class DoubleList{private: //外部应无法访问tagDoubleListNode的存在,即不知道存在tagDoubleListNode子类 typedef struct tagDoubleListNode { P原创 2021-08-31 20:55:59 · 160 阅读 · 0 评论 -
游戏开发之.h、.c、.hpp及.cpp的区别
游戏开发之.h、.c、.hpp及.cpp的区别绝大多数知识来源地【点击跳转】在C语言中,数据结构及函数的声明与实现进行分离有且仅有一种搭配方式:.h、.c.h 用于数据结构及函数的声明.c 用于数据结构的初始化及函数的具体实现。在C++中,数据结构及函数的声明与实现进行分离的方式有两种:①.h、.cpp;②.hpp。在①中,.h用于数据结构及函数的声明;.cpp用于数据结构的初始化及函数的具体实现。在②中,,hpp即负责数据结构及函数的声明,同时负责数据结构的初始化及其函数的具体实现。原创 2021-08-31 20:45:28 · 4587 阅读 · 0 评论 -
游戏开发之纯虚函数、虚析构函数及抽象类(C++)
游戏开发之纯虚函数、虚析构函数及抽象类(C++)1.纯虚函数纯虚函数是一个特殊的函数,在一个类的内部又纯虚函数之后,该类就不可以直接声明为实体类,必须在子类继承该类之后,子类可以间接声明其实体类。纯虚函数在子类是必须要实现的,否则C++编译器会报错。纯虚函数的定义语法:virtual 数据类型 函数名(形参列表) = 0; class A { public: //纯虚函数定义语法: //virtual 数据类型 函数名(形参列表) = 0; virtual void Prin原创 2021-08-29 03:04:39 · 313 阅读 · 0 评论 -
游戏开发之多态及虚函数(C++基础)
游戏开发之多态及虚函数(C++基础)1.多态1.1 多态的分类C++多态从表现形式来看,可以分为虚函数、模板、函数重载、运算符重载等。C++多态从绑定时间来看,可以分为静态多态和动态多态,也称编译器多态和运行期多态。静态多态:函数重载、运算符重载等。对于相关的对象类型,直接实现它们各自的定义,不需要公有基类。动态多态:虚函数等。对于相关的对象类型,确定它们之间的一个共同功能集,然后在基类中把这些共同的功能声明为多个公共的虚函数接口。各个子类重写这些虚函数,实现其具体的功能。1.2 多态的概原创 2021-08-29 02:18:57 · 339 阅读 · 0 评论 -
游戏开发之C++多继承及虚继承(C++基础)
游戏开发之C++多继承及虚继承(C++基础)1.多继承的概念概念:一个类(派生类)同时继承多个父类(基类)。不推荐使用,因为多继承会带来非常严重的二义性(例如:继承的两个父类有同名的成员函数)。多继承之菱形继承实例: class F { public: int f; void PrintF() { std::cout << __FUNCTION__ << " " << __LINE__ << ":" << f &原创 2021-08-27 00:42:28 · 225 阅读 · 0 评论 -
游戏开发之继承中的构造函数、析构函数及继承中的常见问题解决方案(C++基础)
游戏开发之继承中的构造函数、析构函数及继承中的常见问题解决方案(C++基础)1.继承中的类对象模型在C++编译器中,可以将派生类内部理解为结构体,是由基类成员叠加子类新成员及以某种方式关联成员函数形成的结构体。2.对象构造函数和析构函数的调用原则子类(派生类)对象在创建时,会先调用父类(基类)的构造函数。父类(基类)构造函数执行后,才会调用子类(派生类)的构造函数(如果有多个父类,按照继承的顺序执行父类构造函数)。父类构造函数有参数时,需要在子类构造函数的初始化列表中显式调用父类的构造函数原创 2021-08-27 00:23:21 · 303 阅读 · 0 评论 -
游戏开发之C++继承与派生(包含访问控制)(C++基础)
游戏开发之C++继承与派生(包含访问控制)(C++基础)1.继承与派生继承是站在子类的角度上来说的,派生是站在父类的角度来说的。继承是复用父类的功能,实现代码重用。1.继承具有传递性;2.继承不具有对称性;3.基类是对派生类的抽象,派生类是对基类的具体化。继承的声明语法:class 派生类名:权限描述符 继承父类1,权限描述符 继承父类2,…{成员列表}TIPS:父类(基类)名必须是已定义的变量名。 //基类A class A { public: A() {原创 2021-08-26 23:28:10 · 271 阅读 · 0 评论 -
游戏开发之运算符重载(C++基础)
游戏开发之运算符重载(C++基础)① 运算符重载就是对已有的操作规则重写定义,赋予其另一种功能,以适应不同的数据类型。②运算符重载(operator overloading)只是一种“语义上的方便”,也就是它只是另一种函数调用的方式,其本质还是对函数的的调用。1.重载函数运算符重载的函数运算符关联友元函数。(友元函数是一个全局函数,只是友元函数可以访问某个类的私有成员变量。)重载函数运算符的语法:数据类型 operator 运算符(参数列表){函数体} class A { //运算原创 2021-08-26 01:36:47 · 177 阅读 · 0 评论 -
游戏开发之使用类封装动态数组(vector)(C++基础)
游戏开发之使用类封装动态数组(vector)(C++基础)使用类初始化列表、引用、常引用、拷贝构造(深拷贝)、匿名回调函数等知识实现。#include <iostream>#include <functional>//避免二义性,便于阅读理解typedef void* PVOID;//动态数组class Vector{private: PVOID *_pArr; int _nLen; int _nLenMax;public: Vector(int原创 2021-08-26 01:00:43 · 222 阅读 · 0 评论 -
游戏开发之友元类和友元函数(C++基础)
游戏开发之友元类和友元函数(C++基础)可以访问该类的私有成员。友元关系不能被继承。友元关系是单向的。友元没有传递性,A是B的朋友、B是C的朋友、A不一定是C的朋友。 //友元类 //可以访问其私有成员 //友元关系不能被继承 //友元关系是单向的 //友元没有传递性,A是B的朋友、B是C的朋友、A不一定是C的朋友 class A { //友元类的声明 friend class B; //友元函数的声明 friend void Print(A &a);原创 2021-08-25 00:08:28 · 113 阅读 · 0 评论