导语
每隔一段时间,就会学习一次设计模式,每次都会有不一样的领悟
一、目标
代码复用,应对变化
二、方法
隔离变化,各司其职
找出稳定部分和变化部分,进行分离,使它们功能独立
三、原则
- 依赖倒置:变化(实现细节)依赖稳定(抽象)
- 开闭原则:开放扩展,关闭更改
- 单一职责:一个类仅有单一功能
- 替换原则:子类必须能替换基类,实现复用的基石
- 接口隔离:接口小而完备,不依赖不需要的方法
- 组合优先:组合优先继承,继承破坏了封闭性,耦合度高
- 封装变化:松耦合
- 面向接口编程:减少依赖
仰天大笑出门去
导语
每隔一段时间,就会学习一次设计模式,每次都会有不一样的领悟
代码复用,应对变化
隔离变化,各司其职
找出稳定部分和变化部分,进行分离,使它们功能独立
导语
想知道从C++代码/蓝图脚本/资产到打包成可执行程序,UE都帮我们干了些什么吗?
版本:UE4.21
ps:受限于当前的知识水平,难免产生理解错误,后期会继续完善修正。
我粗浅的理解就是UE自己的代码预处理器(相对于C++ 的预处理过程),UHT对代码文件内容进行处理,生成 .generated.h/.gen.cpp 文件,加入反射信息,适配UObject,在以便在在运行时能获取和使用这些数据。
生成的文件在 \Intermediate\Build\Win64\UE4Editor\Inc\YourProject 目录下。
UObject提供了 元数据、反射数据、GC垃圾回收、序列化
UnrealBuildTool (UBT)管理在各种不同的构建配置下构建UE4源代码的过程;
UBT 程序源代码在Engine\Source\Programs\UnrealBuildTool 目录下;
UBT 的配置项在 UnrealBuildTool\Configuration\BuildConfiguration.cs 文件中。
导语
借此理解数组名和数组首地址
c 语言中没有 string 类型, 用 char 类型的数组来表示string,也就是 一串内存地址连续的 char
\0 是字符串的结束符
“asfkhj” 双引号中的内容表示一个常量字符串 const string,本质是一个地址,是第一个字符的地址
char* 表示一个指针变量,当然可以用一个地址来赋值
char a[ ] 表示一个字符串数组,a 是数组名,是const 常量,只能初始化,不能直接赋值,a也表示数组的首地址,也就是第一个元素的地址a[0]
导语
函数不要返回引用类型的临时对象,也不要引用函数返回的临时对象,因为无法预测会发生什么。
引用声明时,需要初始化
引用是被引用对象的别名,和被引用对象绑定后不可变更
引用一定不为空,不需要判定是否空对象
使用引用传递,可以避免临时对象
指针可以多次赋值,改变指向的对象
指针可以指向空
临时对象是在源码中不可见的,是栈上的、没有名字的对象
导语
本篇转载自 C++11常用新特性快速一览 一是方便将来检索,而是后续会按自己的思路重新整理
最近工作中,遇到一些问题,使用C++11实现起来会更加方便,而线上的生产环境还不支持C++11,于是决定新年开工后,在组内把C++11推广开来,整理以下文档,方便自己查阅,也方便同事快速上手。(对于异步编程十分实用的Future/Promise以及智能指针等,将不做整理介绍,组内使用的框架已经支持并广泛使用了,用的是自己公司参考boost实现的版本)
nullptr 出现的目的是为了替代 NULL。
在某种意义上来说,传统 C++ 会把 NULL、0 视为同一种东西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为 ((void*)0),有些则会直接将其定义为 0。
C++ 不允许直接将 void 隐式转换到其他类型,但如果 NULL 被定义为 ((void)0),那么当编译char *ch = NULL;时,NULL 只好被定义为 0。
而这依然会产生问题,将导致了 C++ 中重载特性会发生混乱,考虑:
1 | void foo(char *); |
对于这两个函数来说,如果 NULL 又被定义为了 0 那么 foo(NULL); 这个语句将会去调用 foo(int),从而导致代码违反直观。
为了解决这个问题,C++11 引入了 nullptr 关键字,专门用来区分空指针、0。
nullptr 的类型为 nullptr_t,能够隐式的转换为任何指针或成员指针的类型,也能和他们进行相等或者不等的比较。
当需要使用 NULL 时候,养成直接使用 nullptr的习惯。
导语
uniform initialization(标准初始化)
在c++11之前的版本,初始化是一个没有被统一的写法,有时候用小括号,有时候用大括号,有时候还用赋值号,在c++11中就统一了初始化的形式——“{ }”,直接在对象名后面跟大括号,并在大括号中写入需要初始化的值,并用逗号隔开。甚至类构造函数的初始化列表也可以用“{}”大括号。
在C++11之前,只能对结构体或类的静态常量成员就行就地初始化,其他的不行。如下代码所示:1
2
3
4
5
6class Test
{
private:
static const int a=10; //yes
int a=10; //no
}
在C++11中,结构体或类的数据成员在申明时可以直接赋予一个默认值,初始化的方式有两种,一是使用等号“=”,二是使用大括号列表初始化的方式。注意,使用参考如下代码: