标签:新解 out inter span ati 成员 调用 做什么 nbsp
1.关于几种cast:
简单总结:
static_cast强制类型转换,基本类型间的类型转换安全,子类转父类安全,父类转子类不安全
reinterpret_cast直接重新解释二进制,非常不安全。
dynamic_cast只能转化指针或引用,并且其指向的对象包含虚函数,其主要作用是在运行期间,可以动态合法地将指向父类的指针转换为指向子类的指针,使之能访问子类的成员或函数,蜀国转化失败返回nullptr
const_cast用于丢弃常量指针/应用的const特性,即它们指向的对象可以被修改了(底层const),不能直接更改对象自身的const属性(顶层const)
简单说,static_cast就是显式地强制转换,让编译器和其它开发者知道,开发者知道自己在做什么,了解转换可能不安全的风险。
首先了解顶层const的底层const:
上面p1前的const是修饰p1这个指针,是顶层const,下面这个int *p2前的const修饰的是int,是底层const,指代其指向的是一个常量,不能修改,但p2本身可以修改。而const int &r这类的都是底层const,即指向的对象不可修改,自身可以修改。
const_cast只能去除const指针或引用的const属性,且只能丢弃底层const(如下例) ,const_cast不是改变顶层const,const_cast<int>编译会报错
void ConstTest1(){ const int a = 5; int *p; p = const_cast<int*>(&a); (*p)++; cout<<a<<endl; cout<<*p<<endl; } void ConstTest2(){ const int a = 5; int &r = const_cast<int &>(a); r++; cout<<a<<endl; }
void ConstTest3() {
int a = 5;
int * const pa = &a; // pa 自身是常量
int ** p = const_cast<int**>(&pa); // 对p来说,该const_cast丢弃了其底层const(pa的const)
int x = 10;
(*p) = &x;
cout << *pa << endl;
cout << *(*p) << endl;
}
reinterpret_cast重新解释原来的二进制,非常危险,比static_cast更危险,static还会截断数位保持准备等行为(例如float->int.1.99->1),reinterpret_cast无法将float转为int,编译报错。
总之如果bp是一个基类的指针但是指向一个继承类,可以使用dynamic_cast转换为继承类后,可以用来调用继承类特有的函数或成员。
标签:新解 out inter span ati 成员 调用 做什么 nbsp
原文地址:https://www.cnblogs.com/WonderHow/p/13114722.html