-
const_cast
该操作两句口诀:
“常量指针转化为非常量的指针,并且指向原来的对象”
“常量引用转化为非常量的引用,并且指向原来的对象”
通俗说,该操作会去掉常量属性。
例子如下:
int value = 1; const int* p = &value; //此处底层const无法修改value的值 //*p = 3; //无法修改指向value的值,error C3892: “p”: 不能给常量赋值 int* p1 = const_cast<int*>(p); *p1 = 2; //可以修改指向value的值 std::cout << value << std::endl; //输出为2
注意一点,const_cast只能改变底层const,这句话的涵义我们就上述例子可以看出,value的值,可以被p1修改,但是指针p的指向,我们无法通过p1去更换。
应用场景:
1.函数传参过程中,参数为非const指针,但外面的变量是const常量,且函数内部不会进行更改变量值的行为。
void Func(int * p) { std::cout << *p << std::endl; } int main() { const int num = 1; Func(const_cast<int *>(&num)); return 0; }
2.有一个非const变量,但却被一个const指针所指向了,当只能操作该指针时,我们想要更改该变量的值,可以通过const_cast操作。
int value = 1; const int* p = &value; int* p1 = const_cast<int*>(p); *p1 = 2; std::cout << value << std::endl; //输出为2
-
static_cast
该操作是一种低风险的转换操作,可以对整数、浮点数、字符这些类型之间作转换。
不可用作指针和类型之间的转换
不可用作不同类型指针之间的转换
不可用作不同类型引用之间的转换
int t = 1;
int* p = &t;
char c = static_cast<char>(t); //可以进行转换
//char* p1 = static_cast<int*>(&t); //违法的转换
//int* p2 = static_cast<int*>(t); //违法的转换
-
reinterpret_cast
超级灵活的类型转换,但是无法确定安全性,慎用
-
dynamic_cast
多态基类指针强制转换成派生类指针时,可以检查转换后的指针是否指向派生类的对象,如果转换不安全,返回NULL。
class F
{
public:
virtual void run()
{
}
};
class Son : public F
{
};
int main()
{
F f;
Son s;
Son* s1;
s1 = reinterpret_cast<Son*>(&f);
std::cout << s1 << std::endl; //不为NULL reinterpret_cast不检查是否为派生类指针
s1 = dynamic_cast<Son*>(&f);
std::cout << s1 << std::endl; //NULL,dynamic_cast检测到要转换的&f不是派生类对象
s1 = dynamic_cast<Son*>(&s);
std::cout << s1 << std::endl; //不为NULL,s是派生类对象,&s可以转换成派生类对象
return 0;
}