c++ cast
static_cast
static_cast
(expression)
用于非多态类型的低风险转换,如基类和派生类之间的转换,基本数据类型之间的转换(包括任何隐式转换),用户自定义转换,把void指针转换成目标类型的指针等。不进行运行时类型检查,只在编译时检查。
具体如下
- 用于类层次结构中基类和派生类之间指针或引用的转换。这种转换与dynamic_cast的区别是,static_cast不会进行运行时类型检查,所以如果转换是不安全的,那么编译器也不会给出任何警告或者错误。
class B {};
class D : public B {};
void f(B* pb, D* pd) {
D* pd1 = static_cast<D*>(pb); // Not safe
B* pb1 = static_cast<B*>(pd); // Safe
}
- 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换与C语言中的强制类型转换类似。
void f() {
char ch;
int i = 65;
float f = 2.5;
double dbl;
enum bits {one = 1, two = 2, four = 4};
bits bit;
ch = static_cast<char>(i); // int to char
dbl = static_cast<double>(f); // float to double
i = static_cast<BYTE>(ch);
i = static_cast<int>(two); // enum to int
bit = static_cast<bits>(i); // int to enum
}
- 用于把空指针转换成目标类型的指针。
不同类型指针之间,指针和其他基本数据类型之间都不能进行static_cast转换
void f()
{
void *p = malloc(4);
int *q = static_cast<int*>(p);
char* qq = static_cast<char*>(q); // wrong
int qp = static_cast<int>(q); // wrong
}
reinterpret_cast
允许将任何指针转换为任何其他指针类型。 也允许将任何整数类型转换为任何指针类型以及反向转换。
unsigned short Hash( void *p ) {
unsigned int val = reinterpret_cast<unsigned int>( p );
return ( unsigned short )( val ^ (val >> 16));
}
int main() {
int a[20];
for ( int i = 0; i < 20; i++ )
cout << Hash( a + i ) << endl;
}
const_cast
从某个类删除 const、volatile 和 __unaligned 属性。
底层const:指针指向的值是const;顶层const:指针本身是const
从以下例子可以看出,利用const_static试图对底层const进行修改得到了未定义行为,实际上并没有修改其值;而对象本身不是const,对应指针有底层const,这样可以通过const_cast修改其值。
class CCTest {
public:
void setNumber( int );
void printNumber() const;
private:
int number;
};
void CCTest::setNumber( int num ) { number = num; }
void CCTest::printNumber() const {
cout << "Before: " << number << endl;
const_cast< CCTest * >( this )->number--;
cout << "After: " << number << endl;
}
int main() {
CCTest X;
X.setNumber( 8 );
X.printNumber();
X.printNumber();
const int p = 10;
int *q = const_cast<int*>(&p);
*q = 20;
cout << &p <<" " << q << " " << p << endl;
const int *pp = new int(10);
int *qq = const_cast<int*>(pp);
*qq = 20;
cout << *pp << endl;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通