做梦诗人的博客

仰天大笑出门去


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

  • 搜索
关闭

设计模式笔记

发表于 2019-09-07   |   分类于 C/C++ , design patterns

导语
每隔一段时间,就会学习一次设计模式,每次都会有不一样的领悟

一、目标

代码复用,应对变化

二、方法

隔离变化,各司其职
找出稳定部分和变化部分,进行分离,使它们功能独立

三、原则

  • 依赖倒置:变化(实现细节)依赖稳定(抽象)
  • 开闭原则:开放扩展,关闭更改
  • 单一职责:一个类仅有单一功能
  • 替换原则:子类必须能替换基类,实现复用的基石
  • 接口隔离:接口小而完备,不依赖不需要的方法
  • 组合优先:组合优先继承,继承破坏了封闭性,耦合度高
  • 封装变化:松耦合
  • 面向接口编程:减少依赖
    阅读全文 »

UE4 打包相关(一)

发表于 2019-08-04   |   分类于 UE4 , PACK

导语
想知道从C++代码/蓝图脚本/资产到打包成可执行程序,UE都帮我们干了些什么吗?
版本:UE4.21

基本名词解释

ps:受限于当前的知识水平,难免产生理解错误,后期会继续完善修正。

UHT (UnrealHeaderTool )

我粗浅的理解就是UE自己的代码预处理器(相对于C++ 的预处理过程),UHT对代码文件内容进行处理,生成 .generated.h/.gen.cpp 文件,加入反射信息,适配UObject,在以便在在运行时能获取和使用这些数据。
生成的文件在 \Intermediate\Build\Win64\UE4Editor\Inc\YourProject 目录下。

UObject提供了 元数据、反射数据、GC垃圾回收、序列化

UBT (UnrealBuildTool)

UnrealBuildTool (UBT)管理在各种不同的构建配置下构建UE4源代码的过程;
UBT 程序源代码在Engine\Source\Programs\UnrealBuildTool 目录下;
UBT 的配置项在 UnrealBuildTool\Configuration\BuildConfiguration.cs 文件中。

阅读全文 »

关于char * ,char a[ ] , string

发表于 2019-01-24   |   分类于 C/C++

导语
借此理解数组名和数组首地址

  1. c 语言中没有 string 类型, 用 char 类型的数组来表示string,也就是 一串内存地址连续的 char

  2. \0 是字符串的结束符

  3. “asfkhj” 双引号中的内容表示一个常量字符串 const string,本质是一个地址,是第一个字符的地址

  4. char* 表示一个指针变量,当然可以用一个地址来赋值

  5. char a[ ] 表示一个字符串数组,a 是数组名,是const 常量,只能初始化,不能直接赋值,a也表示数组的首地址,也就是第一个元素的地址a[0]

    阅读全文 »

C++ 临时对象

发表于 2019-01-23   |   分类于 C/C++

导语
函数不要返回引用类型的临时对象,也不要引用函数返回的临时对象,因为无法预测会发生什么。

一、引用和指针的区别

引用

引用声明时,需要初始化

引用是被引用对象的别名,和被引用对象绑定后不可变更

引用一定不为空,不需要判定是否空对象

使用引用传递,可以避免临时对象

指针

指针可以多次赋值,改变指向的对象

指针可以指向空

二、什么是临时对象

临时对象是在源码中不可见的,是栈上的、没有名字的对象

阅读全文 »

C++ 11 特性

发表于 2019-01-22   |   分类于 C/C++

导语
本篇转载自 C++11常用新特性快速一览 一是方便将来检索,而是后续会按自己的思路重新整理

最近工作中,遇到一些问题,使用C++11实现起来会更加方便,而线上的生产环境还不支持C++11,于是决定新年开工后,在组内把C++11推广开来,整理以下文档,方便自己查阅,也方便同事快速上手。(对于异步编程十分实用的Future/Promise以及智能指针等,将不做整理介绍,组内使用的框架已经支持并广泛使用了,用的是自己公司参考boost实现的版本)

1. nullptr

nullptr 出现的目的是为了替代 NULL。

在某种意义上来说,传统 C++ 会把 NULL、0 视为同一种东西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为 ((void*)0),有些则会直接将其定义为 0。

C++ 不允许直接将 void 隐式转换到其他类型,但如果 NULL 被定义为 ((void)0),那么当编译char *ch = NULL;时,NULL 只好被定义为 0。

而这依然会产生问题,将导致了 C++ 中重载特性会发生混乱,考虑:

1
2
void foo(char *);
void foo(int);

对于这两个函数来说,如果 NULL 又被定义为了 0 那么 foo(NULL); 这个语句将会去调用 foo(int),从而导致代码违反直观。

为了解决这个问题,C++11 引入了 nullptr 关键字,专门用来区分空指针、0。

nullptr 的类型为 nullptr_t,能够隐式的转换为任何指针或成员指针的类型,也能和他们进行相等或者不等的比较。

当需要使用 NULL 时候,养成直接使用 nullptr的习惯。

阅读全文 »

C++ 11 变量初始化

发表于 2019-01-21   |   分类于 C/C++

导语
uniform initialization(标准初始化)
在c++11之前的版本,初始化是一个没有被统一的写法,有时候用小括号,有时候用大括号,有时候还用赋值号,在c++11中就统一了初始化的形式——“{ }”,直接在对象名后面跟大括号,并在大括号中写入需要初始化的值,并用逗号隔开。甚至类构造函数的初始化列表也可以用“{}”大括号。

1.就地初始化

1.1 简介

在C++11之前,只能对结构体或类的静态常量成员就行就地初始化,其他的不行。如下代码所示:

1
2
3
4
5
6
class Test
{
private:
static const int a=10; //yes
int a=10; //no
}

在C++11中,结构体或类的数据成员在申明时可以直接赋予一个默认值,初始化的方式有两种,一是使用等号“=”,二是使用大括号列表初始化的方式。注意,使用参考如下代码:

阅读全文 »
123
Dreamingpoet

Dreamingpoet

靡不有初 鲜克有终

26 日志
15 分类
45 标签
RSS
Github
Creative Commons
链接
  • 建站日志
© 2016 - 2023 Dreamingpoet
由 Hexo 生成
主题 - NexT.Pisces