C语言中强制类型转换应该如何正确进行?
- 内容介绍
- 文章标签
- 相关推荐
本文共计682个文字,预计阅读时间需要3分钟。
在C语言中,强制类型转换是直接使用括号的形式,例如:`(类型)表达式`。这种转换方式是安全的,隐含转换发生时,也不会产生错误或异常,且不易被察觉。在C++中,引入了四个新的关键字来支持强制类型转换,包括`static_cast`、`dynamic_cast`、`const_cast`和`reinterpret_cast`,以支持更安全的强制类型转换。语法形式为:`xxx(表达式)`,其中`xxx`为相应的关键字。
在C语言中,强制类型转换是直接使用()的方式,这种转换方式是有安全隐患的,隐患发生时,也不易排查,在C++中,引入了四个新的关键字,来支持强制类型转换,语法形式均为
xxx_cast<newType>(data)
static_cast
静态转换,在编译时即进行转换,转换失败在编译时就会报错,类似于C语言的强制转换方式
- 可用于基本数据类型之间的转换
int n = 100;
char ch = static_cast<char>(n);
- 可用于类的向上转型,但不要用于向下转型,这是不安全的!!!
class Base{};
class Child : public Base{};
//派生类转基类,这种方式是安全的,推荐使用
Child *pChild = new Child();
Base *pBase = static_cast<Base*>(pChild);
//基类转派生类,这种方式是不安全的!!!
Base *pBase = Base();
Child *pChild = static_cast<Child*>(pBase);
dynamic_cast
动态转换,运行时进行检查,如果转型不成功,会返回一个空指针
- 基类必须具有虚函数,因为运行时依赖RTTI进行检查,而它又与虚函数表紧密联系
- 使用该方式,会有额外的函数开销
- 基类指针或引用转派生类时,必须使用此方式
class Base{
virtual func() = 0;
};
class Child : public Base{
virtual func() {}
};
Base *pBase = Base();
Child *pChild = dynamic_cast<Child*>(pBase);
if(pChild)
{
//
}
const_cast
常用来去掉表达式的const或volatile修饰
const int n = 100;
int *p = const_cast<int *>(&n);
reinterpret_cast
最暴力的强制转换,可完成不同类型的指针、引用之间以及整数和指针之间的转换
本文共计682个文字,预计阅读时间需要3分钟。
在C语言中,强制类型转换是直接使用括号的形式,例如:`(类型)表达式`。这种转换方式是安全的,隐含转换发生时,也不会产生错误或异常,且不易被察觉。在C++中,引入了四个新的关键字来支持强制类型转换,包括`static_cast`、`dynamic_cast`、`const_cast`和`reinterpret_cast`,以支持更安全的强制类型转换。语法形式为:`xxx(表达式)`,其中`xxx`为相应的关键字。
在C语言中,强制类型转换是直接使用()的方式,这种转换方式是有安全隐患的,隐患发生时,也不易排查,在C++中,引入了四个新的关键字,来支持强制类型转换,语法形式均为
xxx_cast<newType>(data)
static_cast
静态转换,在编译时即进行转换,转换失败在编译时就会报错,类似于C语言的强制转换方式
- 可用于基本数据类型之间的转换
int n = 100;
char ch = static_cast<char>(n);
- 可用于类的向上转型,但不要用于向下转型,这是不安全的!!!
class Base{};
class Child : public Base{};
//派生类转基类,这种方式是安全的,推荐使用
Child *pChild = new Child();
Base *pBase = static_cast<Base*>(pChild);
//基类转派生类,这种方式是不安全的!!!
Base *pBase = Base();
Child *pChild = static_cast<Child*>(pBase);
dynamic_cast
动态转换,运行时进行检查,如果转型不成功,会返回一个空指针
- 基类必须具有虚函数,因为运行时依赖RTTI进行检查,而它又与虚函数表紧密联系
- 使用该方式,会有额外的函数开销
- 基类指针或引用转派生类时,必须使用此方式
class Base{
virtual func() = 0;
};
class Child : public Base{
virtual func() {}
};
Base *pBase = Base();
Child *pChild = dynamic_cast<Child*>(pBase);
if(pChild)
{
//
}
const_cast
常用来去掉表达式的const或volatile修饰
const int n = 100;
int *p = const_cast<int *>(&n);
reinterpret_cast
最暴力的强制转换,可完成不同类型的指针、引用之间以及整数和指针之间的转换

