C++类型转换

https://www.nowcoder.com/questionTerminal/5e5bb7214788436cb966e67305a8041e?pos=242&mutiTagIds=138&orderByHotValue=1

看一道题: 假设定义了ClassA* pA2,下面正确的代码是?

class A
{ public: virtual void FunTestA(){}};
class B
{ public: virtual void FunTestB(){}};
class C: public B, public A
{};
int main() {
C c;
A* pA = &c;
B* pB = &c;
C* pC = &c;
return 0;
}
A   pA2=static_cast<ClassA*>(pB);
B   void* pVoid=static_cast<void*>(pB);
    pA2=static_cast<ClassA*>(pVoid);
C   pA2=pB;
D   pA2=static_cast<ClassA*>(static_cast<ClassC*>(pB));

答案 B D

static_cast 的用法

static_cast < type-id > ( expression )

​ 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:

​ ①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。

​ 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;

​ 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。

​ ②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。

​ ③把空指针转换成目标类型的空指针。

​ ④把任何类型的表达式转换成void类型。

​ 注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。 const_cast可以去掉const属性,但依旧不能改变其内容。

​ C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作。因此,被做为显式类型转换使用。

​ C++中的reinterpret_cast主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。

阅读更多

没有更多推荐了,返回首页