StoneのBLOG

生活这种事情,从来都是自我陶醉

0%

C++中的强制类型转换-cast

实在是遇见太多次了,遇见了还看不懂,再不整理就过分了。关于C++中的强制类型转换问题。这次的主角是:stati_cast,dynamic_cast,const_cast,reinterpret_cast

static_cast

提笔要写,先看别人的总结

这里我遇见的情况就是static_cast的重要的用法。继承类型的向下类型转换。下面来看看我遇见的神仙代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
template<class T>
class Singleton : NonCopyable
{
public:
Singleton()
{
assert(!m_instance);
m_instance = static_cast<T*>(this);
}

~Singleton()
{
assert(m_instance);
m_instance = 0;
}

static T* getInstance()
{
return m_instance;
}

private:
static T* m_instance;
};

template<class T>
T* Singleton<T>::m_instance = NULL;

一个单例模板类,读代码的时候,按照这个模板被实例化的是他的子类,顺便这个子类所具有的instance的引用就变成它自己了。我什么时候也能写出这么优秀的代码。

还有其他的强制类型转换,遇见的时候具体分析吧。

const_cast

在做各种数据类型匹配的时候,遇到了这样的问题:

1
2
3
// UE4 C++
FString text = "111";
TCHAR* t_text = *text;

上面是想把FString类型转化为TCHAR*类型的数据。

但是上面的会报错,原因是无法将const THCAR*转化为TCHAR*。那就直接加上关键字const就解决了。但是问题是这个t_text是我设置的即将要传入另外一个函数的参数,它要是设置为常量类型的话就没法传参了。

把常量指针变成普通的指针,就是我接触到const_cast的起因。但是关于它的使用,可不是一句话就能总结的。

const_cast实现的原因在于C++对于指针的转换是任意的,它不会检查类型,任何指针之间都可以进行互相转换。

去const限定

1
2
const TCHAR* t_text = "1234";
TCHAR* text = const_cast<TCHAR*>(t_text);

将常量指针转化为了正常指针,但是正常情况下不会做这种弱智操作。正常声明就行了,但是有的时候要传参的情况传的不是常量怎么办,那只好强制转换了。

去const限定的操作绝对不是为了修改它的内容,既然声明了常量还要修改那为什么还要声明为常量。既然声明了常量就要贯彻到底。绝对不对const数据进行重新赋值

根据别人的文章内容,强行修改常量的值会产生未定义行为(Undefined Behavior),这种行为由编译器决定如何处理。