
C++基础
文章平均质量分 81
Jerish_C
知乎专栏:https://www.zhihu.com/people/chang-xiao-qi-86/columns
微信公众号:游戏开发那些事
B站技术视频:https://space.bilibili.com/306838835
展开
-
虚幻引擎与现代C++:转移语义和右值引用
所谓的“现代C++”,就是指C++ 11标准之后的C++语言,与之相对应的是“经典C++”,也就是C++ 98/03标准的C++语言。Unreal En...转载 2020-03-13 09:00:00 · 933 阅读 · 0 评论 -
字符集详解(一看就懂系列)
http://blog.youkuaiyun.com/qq_28098067/article/details/53486032一、编码历史与区别 一直对字符的各种编码方式懵懵懂懂,什么ANSI UNICODE UTF-8 GB2312 GBK DBCS UCS……是不是看的很晕,假如您细细的阅读本文你一定可以清晰的理解他们。Let'sGo! 很久很久以前,有一群人转载 2017-08-27 11:36:30 · 2816 阅读 · 0 评论 -
理解浮点数的构成
理解浮点数的构成个人觉得对于新手是一个比较困难的事,我就想了好久,看了好几篇参考资料,才大概弄清。。。下面就说一下自己的理解吧~关于单精度浮点型的构造:一般6-8位有效数字(假设float占4个字节,一个符号位,8个指数位,23个尾数。符号位[ ]+(只存放指数)指数位[ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]+尾数[ ]*23)原创 2015-09-15 22:16:03 · 5604 阅读 · 0 评论 -
直接初始化与拷贝(复制)初始化
认识这两种初始化有助于我们加深对语言的理解,可以更好的优化代码~我们常见的几种初始化的形式:string str1 = "first"; //拷贝初始化string str2(10,'a'); //直接初始化string str3(str2); //直接初始化string str4 = string(10,'b'); //拷贝初原创 2016-01-19 20:57:45 · 5842 阅读 · 8 评论 -
dynamic_cast与一般的强制转换
接触过C语言的同学可能很喜欢使用C风格的强制转换(也就是一般形式的强转)。(类型)变量用起来很方便,可以显式的把某些类型转换成我们想要的类型,比如(int*)字符。这样的使用对常见的内置类型可谓是屡试不爽,但是对于C++中的对象用起来却是危机四伏。所以dynamic_cast应运而生。我们很容易查到dynamic_cast 的定义是将一个基类对象指针(或引用)cast到继承类指针,dy原创 2017-04-04 12:13:16 · 13450 阅读 · 4 评论 -
UE4反射系统简析(含实例过程分析)
一、UE4中的反射系统1.简述:1.1 什么是UE4反射在UE4里面,你无时无刻都会看到类似UFUNCTION()这样的宏。官方文档告诉你,只要在一个函数的前面加上这个宏,然后在括号里面加上BlueprintCallable就可以在编辑器里面调用了。按照他的指示,我们就能让我们的函数实现各种各样特别的功能,那这个效果就是通过UE4的反射系统来实现的。这看起来确实非常棒,不过同时给UE4原创 2016-10-23 15:44:25 · 25907 阅读 · 1 评论 -
Introduction to C++ Programming in UE4——UE4官方文档翻译与理解(二)
虚幻4的编程以C++为主,虚幻引擎根据自自身特点重写了很多数据类型与结构,而且里面用到了很多新的C++标准内容以及自有的特性。研究UE4能同时提升我们对C++的理解以及对虚幻引擎的理解~在我写第一部分的时候还没有官方的汉语翻译,所以第一部分是由本人自己翻译的。既然现在已经有了官方翻译,那我就整理一下中英对照,不过我仍然会在其中加入自己的理解来帮助大家分析UE4本身的一些特性。原创 2016-08-28 13:40:19 · 2536 阅读 · 0 评论 -
Introduction to C++ Programming in UE4——UE4官方文档翻译与理解(一)
UE4这篇官方文档大体上讲解了UE4本身的诸多特性以及如何编写基本的C++代码,对理解UE4的编程基础内容非常有帮助,还是因为没有对于的汉语翻译。所以,这里我把这篇文档翻译出来,之后还会简洁的对其进行必要的总结。由于内容比较多,会分两个部分进行编写,持续更新~Unreal C++ is Awesome!(虚幻4的C++是了不起的)This guide is原创 2016-05-10 11:22:01 · 5660 阅读 · 0 评论 -
62条 不要允许异常跨越模块边界传播——C++编程规范解析
最近在看C++编程规范,第一遍时完全是一头雾水,然后就在本子上记了好多问题,后来稍微理解了些,就把自己的理解写出来和大家分享一下1.C++异常处理没用普遍通用的二进制标准说明了什么问题?编译器编译生成的obj是二进制文件,然而不同系统不同编译器生成同一份C++代码的二进制文件是不同的,换句话说你调用其他的dll库时所抛出的异常很可能是无法识别的。 2.不要在两段代码传播异常原创 2016-03-05 18:07:55 · 2088 阅读 · 0 评论 -
史上最全的C++/游戏开发面试问题总结(二)——虚函数,内存,STL
笔者毕业两年,最近通过猎头拿到了腾讯游戏以及网易游戏的两个客户端研发offer(UE4/C++)。在面试前夕,笔者对C++进行了较为全面的复习和总结,乐观估计可以涵盖80%左右的面试基础问题。这个系列的文章预计有《C++基础》、《内存、STL、虚函数相关》、《数据结构与算法》、《操作系统与网络》四篇(当前是第二篇),每篇都是以问答的形式分享并给出了参考资料的链接地址。大部分问题回答的比较简洁,需...原创 2019-08-10 18:53:07 · 4632 阅读 · 3 评论 -
史上最全的C++/游戏开发面试问题总结(一)——C++基础
笔者毕业两年,最近通过猎头拿到了腾讯IEG以及网易游戏的两个客户端研发offer(UE4/C++)。在面试前夕,笔者对C++进行了较为全面的复习和总结,乐观估计可以涵盖80%左右的面试基础问题。这个系列的文章预计有《C++基础》、《内存、STL、虚函数相关》、《数据结构与算法》、《操作系统与网络》四篇(后续可能会调整),每篇都是以问答的形式分享并给出了参考资料的链接地址。大部分问题回答的比较简洁...原创 2019-05-02 12:59:06 · 23894 阅读 · 9 评论 -
被知乎大佬嘲讽后的一个月,我重新研究了一下内联函数
这绝不仅仅是一篇讲内联意义的文章,参考我的学习过程,可能对你的知识整合有很大帮助之前写了一篇总结c++面试的文章,被大佬纠出来很多关于内联的问题与错误。抱着不误导别人以及学习的态度,我在之后的一个月里抽时间重新研究了一下内联函数,确实学到了很多以前不了解的知识。学习么~就是一个不断打破之前认知并重构知识的过程,每个人都是从一个什么都不懂的菜鸟逐渐成长为一个大牛的。在这篇文章里,我会由浅入深的分...原创 2019-01-04 10:11:18 · 3716 阅读 · 5 评论 -
《Exploring in UE4》多线程机制详解[原理分析]
目录一.概述二."标准"多线程三.AsyncTask系统3.1 FQueuedThreadPool线程池3.2 Asyntask与IQueuedWork 3.3 其他相关技术细节四.TaskGraph系统4.1 从Tick函数谈起4.2 TaskGraph系统中的任务与线程4.3 TaskGraph系统中的任务与事件4.4 其他相关技术细节五.总结一.概述多线程是优化项...原创 2018-09-23 15:02:31 · 3097 阅读 · 3 评论 -
如何理解char型指针与int型指针的不同表现
这里是按照我的想法来猜测语言设计时的一些特性,如果有高人能进一步指点,不胜感激~其实一直对字符串数组与字符串指针都抱有很多疑问,因为它用起来和整型指针相比完全不是一个风格。比如char *str =”char test”;可以这样直接赋值而整型int *a = {1,2,3}却完全不合理我们可以很容易的理解int型指针,a就是指针是一个地址,&a就是指向的数据。然而str就是字符串”cha...原创 2015-12-26 18:39:10 · 9100 阅读 · 2 评论 -
C++后台面试常见问题与回答(持续更新)
最近觉得自己的基础知识不够牢固,所以在网上找到一些常见的面试问题,自己试着去学习并解答,希望对找工作的朋友有一定的帮助。 由于C++面试涉及的知识非常多,我也是一边复习一边总结,所以这个文档会持续更新下去。有时间还会再每个问题后面添加一些相关书籍与链接等,方便进一步深入学习与理解。**C++基础** 问:C++内存模型是什么?如何理解自由存储区与堆的区别?在C++中,内存...原创 2017-10-26 21:48:14 · 8699 阅读 · 0 评论 -
Const用法总结(快速区分指针常量与常量指针)
想当初面试时,面试官问我熟悉C++么?熟悉的话说一下const的用法,然后我就开始凌乱了~其实const的用处还真不少,好好捋顺一下会有很大的帮助。有时候我们希望定义一种常量,它的值不能被修改,这个常量既可以防止程序其他地方不小心修改这个值,也能让程序员比较方便的调整这个值的大小。以往我们很容易想到#define宏定义,现在使用const是个更为不错的选择,因为它有类型,可以进行...原创 2015-10-09 23:10:25 · 5427 阅读 · 3 评论 -
一张图搞定UE4中代理(delegate,event)的使用
UE4中的代理实现与普通C++的代理实现思路相同,不过特殊处理了UObject继承体系下类成员函数的绑定与执行。由于官方文档没有例子,大家可以参考下面的图片来使用(其实例子大家完全可以到UE源码里面去找,这里算是帮助各位总结了一下) 不过既然是使用UE4,C++代理说完了怎么能少了蓝图代理的使用? 其他注意事项:如果想使用带有RPC的代理事件,需要在创建Event的同时断开任何连线,这样点...原创 2017-11-14 09:41:19 · 12121 阅读 · 0 评论 -
63在模块的接口中使用具有良好可移植性的类型——C++编程规范解析
有时,即使是C++内置类型,也可能和我们所调用模块的基本类型占用的内存大小有所区别,比如int占几个字节。所以,我们对程序的类型抽象的越高,在功能上使用起来可能就越安全和方便,但是对使用的范围和限制可能也就越多,这是我们要对自己工程项目所要衡量的东西。原创 2016-03-13 14:47:21 · 1175 阅读 · 0 评论 -
进一步理解C++构造与析构
在之前的浅析C++智能指针一文中,我们提到过,在C语言中我们用malloc和free来申请和释放内存。而在C++语言中,我们常用new与delete来申请和释放内存。我们要知道,new,delete与malloc,free是有区别的,new一个对象时,我们不仅申请了内存同时构造了对象,delete一个对象时,我们不仅释放了内存还销毁了对象。 那么我们在C++中想分开操作或只想申请内存怎原创 2016-01-19 20:53:55 · 1609 阅读 · 1 评论 -
uint16,uint32是什么?
记得之前在刷笔试题的时候就看见过这个问题,发现当时上网百度后又忘了。最近在看CryEngine3引擎代码的时候又晕了,趁现在赶紧记下来~在查看CE3的代码时我发现了这个变量,TFlowNodeIdm_flowNodeId;心想这是什么鬼?(请理解一个菜鸟没啥经验)然后果断在VS下按F12查看定义,连着按了几次我终于捋清其中的奥妙。所以我干脆把uint8,uint32原创 2015-08-22 17:02:42 · 25029 阅读 · 0 评论 -
模板编译与实例化浅析
编译整体过程(针对C/C++),1. 预处理:包含宏替换,条件编译,include导入文件2. 编译: 包含词法分析,语法分析,语义分析,中间代码生成与优化,生成汇编文件3. 汇编: 将汇编文件编译成2进制的机器码4. 链接: 将目标文件与外部符号进行链接,得到一个二进制可执行文件 当编译器遇到一个模板定义时,它并不生成代码。只原创 2015-11-12 22:36:34 · 3038 阅读 · 0 评论 -
三段话理解重载,覆盖,隐藏
三段话理解重载,覆盖,隐藏: 重载,指成员函数被重载: (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual关键字可有可无。 覆盖,是指派生类函数覆盖基类函数:(1)不同的范围(分别位于派生类与基类); (2)函数名字相同; (3)参数相同; (4)基类函数必须有virtual关键字。 隐藏,是指派生类原创 2015-09-15 22:33:34 · 784 阅读 · 0 评论 -
C++模板的理解与使用
最近发现原来学的东西根本都不理解,所以本人正在恶补C++,把自己对C++中概念的最简单粗暴的理解写下来。有问题的地方还请指出~随时更正模板:顾名思义,就是为了方便以后使用而出现的东西,生活中的模板让我们可以轻松仿照而做出自己的东西,C++中的模板也是类似的。一句话理解模板,类型参数化,让程序员编写与类型无关的代码。我们知道任何语言变量都是有类型的,C/C++/Java,包括原创 2015-08-22 11:01:21 · 2601 阅读 · 3 评论 -
类在内存中的分配
对于一个声明好的类,里面可能有成员函数,静态成员函数,成员变量,静态成员变量,虚函数等,那么这些数据都是怎么分配到内存的呢?class A{ //一个简单的类,方便下面描述信息public:void Show(){ cout<<”I am A”<<endl;}int a;char b;double c;};int main(){A a;a. Show ();}原创 2015-08-29 23:02:15 · 2044 阅读 · 0 评论 -
继承下构造函数的执行顺序
这里先给出结论,在贴出代码与执行结果~ 一个派生类构造函数的执行顺序如下:第一步执行:虚拟基类的构造函数(多个虚拟基类则按照继承的顺序执行构造函数)。第二步执行:基类的构造函数(多个普通基类也按照继承的顺序执行构造函数)。第三步执行:类类型的成员对象的构造函数(按照初始化顺序)。第四部执行:派生类自己的构造函数。 如果一个派生类不仅继承于一个基类,而且还有这个基类的原创 2015-09-15 22:41:21 · 1982 阅读 · 0 评论 -
C++虚函数与虚表
有一定面向对象知识的朋友对继承与多态一定很熟悉,C++想实现继承的话就要使用虚函数,那么什么是虚函数,其原理是什么,下面尽量给大家分析一下C++中其运行机制: 首先,基础,什么是虚函数,什么是多态?答:被virtual关键字修饰的成员函数,就是虚函数。虚函数用来实现多态性(Polymorphism),将接口与实现进行分离;简单来说就是实现共同的方法,但因个体差异而采用不同的策略。举原创 2015-08-30 21:37:00 · 1078 阅读 · 0 评论 -
解决浮点数自动取整问题
虽然是个小问题,不过之前竟然没想过,所以还是记下来给自己一个教训~今天在项目计算图片宽度时,遇到了一个很奇怪的问题,我的图片怎么也显示不出来~代码如下: m_pRenderer->Draw2dImage(m_positionX,m_positionY,m_pTexture->GetWidth()*(800/1920)*m_scale,m_pTexture->GetHeight()*(6原创 2015-09-15 22:10:58 · 4921 阅读 · 0 评论 -
lib与dll的关系(详解静态链接库和动态链接库)
最近接触到的游戏会有很多的dll和lib文件,之前关于动态链接库和静态链接库一直很不理解,最近发现了一篇很好的文章,非常清晰的讲解了dll与lib的关系,这里拿出来给大家分享下。原文链接:http://blog.163.com/zhengjiu_520/blog/static/3559830620093583438464/前面有一章说编译与链接的,说得很简略,其实应该放转载 2015-12-29 22:17:32 · 8203 阅读 · 4 评论 -
char * itoa(int, char *, int); 第二个参数明明是char*,为什么却又不能是“char*”?
char * itoa(int originNum, char * targetStr, int standard); 第二个参数明明是char*,为什么不能是“char*”???这里来简单介绍一下字符串数组与字符串指针的区别~原创 2015-12-26 19:18:29 · 2806 阅读 · 0 评论 -
模板非类型形参的详细阐述
关于模板的非类型形参,网上有很多内容,C++primer只有大概一页的阐述,但是都不够清晰详细。下面我尽可能从自己的角度去给大家描述一下非类型形参的相关细节。如果想进一步理解非类型形参以及模板内容可以阅读C++template这本书,在4.1节,8.3.3节,13.2节都有相关解释。这里要强调一点,我们对于非类型形参的限定要分两个方面看1.对模板形参的限定,即template<>里面的参数2.对模板实参的限定,即实例化时<>里面的参数原创 2016-03-02 15:34:58 · 9271 阅读 · 0 评论 -
stdafx有什么用(包含相关问题分析)
使用过Visual Studio,VC++的朋友对stdafx.h这个文件一定非常熟悉。我们新建工程的时候他就自动出现了,并且在每个.cpp文件的最前面都有一个#include "stdafx.h"。这个文件一定有他的作用,然而我们也经常会因为他遇到各式各样的问题,所以这里给大家介绍一下这个文件的作用和意义。 简介:stdafx,全称StandardApplication Framew原创 2016-03-07 20:25:10 · 10317 阅读 · 2 评论 -
C++异常基础
最近在看C++编程规范和C++primer,遇到了有关异常的一些内容,在此简单总结一下,以后可能会继续补充1.异常的意义是什么?为什么要进行异常处理?异常机制允许我们在运行时就对出现的问题进行及时处理,假如我们的程序运行过程出现错误,我们又不想让程序直接挂掉,我们就可以对可能出现的错误提前进行处理。异常机制使我们能将问题的检测与解决过程分开,模块化设计是大家所提倡的,既然我们决原创 2016-03-05 14:51:09 · 982 阅读 · 0 评论 -
理解C++的链接:C++内链接与外链接的意义
首先理解什么是编译单元?什么是内部链接?什么是外部链接?定义这样的内链接与外链接有什么意义?为什么不要在头文件中定义具有外部链接的实体? 在头文件中定义具有内部链接的实体有什么劣势?原创 2015-12-29 22:31:40 · 5954 阅读 · 0 评论 -
浅析C++智能指针
在C语言中我们用malloc和free来申请和释放内存。而在C++语言中,我们常用new与delete来申请和释放内存。那么无论是C还是C++我们都很容易在动态内存的管理上出现问题,1.忘记delete内存,导致内存泄露。如果在变量当前的作用域没有及时释放内存,那么之后就再也没有机会了,而且你可能完全意识不到这个错误,知道系统内存耗尽而崩溃。 2.使用已经释放的内存。你在释放内原创 2016-01-10 18:02:32 · 1191 阅读 · 0 评论 -
代码规范小结(二)
前一阵由于修改别人的优质代码而感慨不已,所以想要写一些代码规范的说明,也算是给自己一个提醒。既然如此,就一气呵成,再写一些感觉比较重要的规范。 1. 防止头文件被重复引用,使用#ifndef 工程名_路径_文件名/#define工程名_路径_文件名/#endif结构或者#program once来实现预处理这里关于#ifdef和#program once的区别做一下简单的原创 2015-12-08 22:26:31 · 708 阅读 · 0 评论 -
图解数组指针与多维数组(附:为什么指针加一,地址不一定加一)
为什么指针加一,地址不一定加一?我们发现对指针地址进行加一后,我们的地址并不会直接加一,而是加了一个中间包含数据所占字节数的大小。原创 2015-12-18 22:14:23 · 3131 阅读 · 1 评论 -
求C++数组长度问题
今天写代码的时候突然发现个问题,有类似这样一个函数,数组作为参数void FormHead::ShowNum(intnumOfBoth[]){ if(curMapId== 3) { FlashValueconditionNum[4]; conditionNum[0].SetInt(numOfBoth[0原创 2016-01-19 20:53:10 · 2446 阅读 · 0 评论 -
快速理解类的访问控制(public,protected,private)
接触过面向对象编程的朋友们都知道类中的访问控制符无非有三个,public, protected, private。理解他就先从期望他达到的效果先说吧 Public: 使成员对于整个程序内(类内类外)都是可以访问的Protected: 使派生类也可以访问其数据,但是又不想让其他的函数或类进行访问Private: 只有他所在类的成员函数可以访问 在没有继承这一概念前,我们先原创 2015-09-10 23:32:29 · 2843 阅读 · 0 评论