UE_C++ —— 数据类型
目录
一,基本数据类型
二,字符串类型
三,容器类型
一,基本数据类型
UE对C++基本数据类型进行了深度重定义,并禁止使用原生的C++基本数据类型,以保证引擎的跨平台特性;
布尔类型(bool),代表布尔值,即true或false;
字符类型(TCHAR),代表字符型,用于支持宽字符(如Unicode字符集),以保证跨平台兼容性;
短整形(short),2个字节;
无符号和有符号整数类型
- int,标准整形,根据系统架构(32位或64位)的不同,其大小可能有所不同(32位4字节、64位8字节);
- uint8(1字节)、uint16(2字节)、uint32(4字节)、uint64(8字节)
- int8(1字节)、int16(2字节)、int32(4字节)、int64(8字节)
长整形(long),4个字节;
长长整形(long long),8个字节;
浮点类型
- float(单精度浮点型,4字节)
- double(双精度浮点型,8字节)
二,字符串类型
FString,动态字符数组;
- 用于存储可变的字符串,必须用TEXT宏包裹字符串;
- 开销大于其他类字符串类型,是处理字符串的主要类型;
FName,资源命名字符串;
- 用存储名称(散列存储),速度快,必须用TEXT宏包裹字符串;
- 大小通常为8byte,只进行一次字符串哈希映射,在比较字符串时不区分大小写;
- 常被用于存储不可变的字符串,如资源路径、资源文件类型、平台标识等;
- 在引擎的UObject中用于储存对象名称,以提高性能;
FText,显示字符串;
- 处理用户的显式文本,提供了对字符串进行格式化、本地化等操作的功能;
- 大小为40bytes,核心实质是一个TSharedRef<ITextData>,即实际文本数据的智能引用;拷贝成本非常低,只需拷贝指针而不是整个字符串数据;
- 不可变,不提供修改函数,无法进行内容修改;
//FString类
//构造与赋值
FString str1; // 创建一个空的FString对象
FString str2(TEXT("Hello")); // 使用TEXT宏创建一个包含"Hello"的FString对象
FString str3 = str2; // 通过拷贝构造函数赋值
FString str4 = TEXT("World"); // 直接使用TEXT宏进行赋值//追加
FString str = TEXT("Hello, ");
str.Append(TEXT("World!")); // 使用Append函数追加字符串,结果str为"Hello, World!"
str += TEXT(" Again!"); // 使用+=运算符追加字符串,结果str为"Hello, World! Again!"//插入
FString str = TEXT("Hello");
str.InsertAt(5, TEXT(" World")); // 在索引5的位置插入字符串" World",结果str为"Hello World"//替换
FString str = TEXT("Hello World");
str = str.Replace(TEXT("World"), TEXT("UE")); // 将"World"替换为"UE",结果str为"Hello UE"//查询
FString str = TEXT("Hello World");
bool containsHello = str.Contains(TEXT("Hello")); // 判断是否包含子字符串"Hello",结果为true
int32 index = str.Find(TEXT("World")); // 查找子字符串"World"的索引,结果为6
bool startsWithHello = str.StartsWith(TEXT("Hello")); // 判断是否以"Hello"开头,结果为true
bool endsWithWorld = str.EndsWith(TEXT("World")); // 判断是否以"World"结尾,结果为true//格式化
FString playerName = TEXT("John");
FString greeting = FString::Printf(TEXT("Hello, %s!"), *playerName); // 使用Printf函数格式化字符串,结果greeting为"Hello, John!"//路径拼接
FString basePath = TEXT("C:/Users/Documents/");
FString fileName = TEXT("example.txt");
FString fullPath = basePath / fileName; // 使用/运算符进行路径拼接,结果fullPath为"C:/Users/Documents/example.txt"FString fullPath;
fullPath.PathAppend(fileName, TEXT("example.txt").Length()); // 将文件名追加到基路径上,注意需要传递文件名的长度
//FName
//创建
FName myFName(TEXT("MyObjectName"));
//比较
if (myFName == FName(TEXT("MyObjectName")));
//FText
FText myText = TEXT("Hello, World!");
FText formattedText = FText::Format(TEXT("Hello, {0}!"), TEXT("World"));
三,容器类型
TArray,UE定义的增强数组容器;
- 是一个同质容器,即其所有元素均完全为相同类型;
- 与std::vector类似,可动态扩充内存;当容量满了,会额外分配一个更大的内存,并将数据拷到新内存上,之后再释放旧的内存;
- 提供了比标准C++数组更丰富的功能,如动态扩展、排序、查找等;
- 具有速度快、内存消耗小、安全性高等特点;
TSet,存储值本身的松散的集合;
- 默认不允许元素重复,存储唯一元素;
- 基于哈希表实现,提供了快速的查找、插入和删除操作;
TMap,key-value类型容器;
- 允许通过键来快速查找对应的值,适用于需要快速访问数据的场景;
- 基于哈希表实现,提供了高效的查找性能;
- 键必须是唯一的,而值可以是任何类型;
//TArray
#include "Containers/Array.h"
TArray<int32> IntArray; //初始化一个空的TArray//添加元素
IntArray.Add(10);
IntArray.Add(20);
IntArray.Add(30);
IntArray.AddUnique(30);//使用索引访问元素
UE_LOG(LogTemp, Warning, TEXT("Element at index 1: %d"), IntArray[1]); //输出: Element at index 1: 20//使用范围for循环迭代元素
for (int32 i : IntArray)
{UE_LOG(LogTemp, Warning, TEXT("Element: %d"), i);
}IntArray.RemoveAt(1); //移除索引为1的元素,即20
IntArray.Empty(); //清空数组
//TSet
#include "Containers/Set.h"
TSet<int32> IntSet; //声明一个存储int32的TSet
TSet<FString> StringSet = { TEXT("Hello"), TEXT("World") }; //使用初始化列表IntSet.Add(10);
IntSet.Add(20);
IntSet.Add(10); //这个不会被添加,因为10已经存在IntSet.Contains(20); //检查TSet中是否包含某个元素
IntSet.Remove(10);
IntSet.Empty();
//TMap
#include "Containers/Map.h"
TMap<FString, int32> StringToIntMap; // 声明一个存储FString到int32映射的TMap// 初始化通常是通过Add方法
StringToIntMap.Add(TEXT("One"), 1);
StringToIntMap.Add(TEXT("Two"), 2);
StringToIntMap.Add(TEXT("Three"), 3);
StringToIntMap.Add(TEXT("One"), 10); // 这会覆盖键为"One"的值,新的值为10//查找元素
if (StringToIntMap.Contains(TEXT("Two")))
{int32 value = StringToIntMap[TEXT("Two")]; // 更常见的查找方式,但如果键不存在会触发断言(在开发构建中)// 或者使用Find来避免断言int32* valuePtr = StringToIntMap.Find(TEXT("Two"));if (valuePtr){int32 value = *valuePtr;}
}StringToIntMap.Remove(TEXT("One"));
StringToIntMap.Empty();