题目: 关于C++中, 四种范例转换的要害字, 的详解, 也可以给出代码, 判定输出 或 判定哪些代码有误.

谜底及典型如下:

四种要害字: const_cast, 常量性转除;dynamic_cast, 向下安详转型; reinterpret_cast, 从头表明转型; static_cast, 静态转型;

1.  const_cast, 常量性转除:

主要对变量的常量性(const)举办操纵, 移除变量的常量性, 即可以被很是量指向和引用, 详见代码;

2. dynamic_cast, 向下安详转型:

主要应用于担任体系, 可以由 "指向派生类的基类部门的指针", 转换"指向派生类"或"指向兄弟类";

static_cast只能转换为"指向派生类";

3. reinterpret_cast, 从头表明转型:

主要是对2进制数据举办从头表明(re-interpret),不改变名目, 而static_cast会改变名目举办表明;

如由派生类转换基类, 则从头表明转换, 不改变地点, 静态转换改变地点;

4. static_cast, 静态转型:

主要是数据范例的转换, 还可以用于担任;

代码如下:

/* 
 * cppprimer.cpp 
 * 
 *  Created on: 2014.2.10 
 *      Author: Spike 
 */
      
/*eclipse cdt, gcc 4.8.1*/
      
#include/*常量性移除指针详解*/
      
struct S {  
    S() : value(0) {}  
    int value;  
};  
      
void CastConst (void)  
{  
    const S s;  
    std::cout << "s.value = " << s.value << std::endl;  
    //S* ps = &s; //error, 指向常量  
    S* ps = const_cast(&s);  
    ps->value = 1;  
    std::cout << "s.value = " << s.value << std::endl;  
    //S& rs = s; //error, 引用常量  
    S& rs = const_cast(s);  
    rs.value = 2;  
    std::cout << "s.value = " << s.value << std::endl;  
}  
      
/*安详向下转型*/
      
struct B /*基类B*/ {  
    virtual void f() { std::cout << "Base::f" << std::endl; }  
    void thisf() { std::cout << "Base::thisf" << std::endl;}  
    virtual ~B() {}  
};  
      
struct B2 /*基类B2*/ {  
    virtual void g() { std::cout << "Base2::g" << std::endl; }  
    void thisg() { std::cout << "Base2::thisg" << std::endl;}  
    virtual ~B2() {}  
};  
      
struct D : public B, public B2 /*派生类D*/ {  
    virtual void f() { std::cout << "Derived::f" << std::endl; }  
    virtual void g() { std::cout << "Derived::g" << std::endl; }  
    virtual ~D() {}  
};  
      
void CastDynamic (void)  
{  
     B* pB_D = new D;  
     pB_D->f();  
     //pD->g(); //error, 只包括B部门  
      
     D *pD_D = dynamic_cast(pB_D); //转换为派生类  
     pD_D->g();  
     B2* pB2_D = dynamic_cast(pB_D); //转换为兄弟类  
     pB2_D->g();  
      
     D *pD_Ds = static_cast(pB_D);  
     pD_Ds->g();  
     //B2* pB2_Ds = static_cast(pB_D); //error, 不能转换为兄弟类  
}  
      
/*从头表明转型*/
      
struct rA { int m_a; };  
struct rB { int m_b; };  
struct rC : public rA, public rB {};  
      
void CastReinterpret (void)  
{  
    int *i= new int;  
    *i = 10;  
    std::cout << "*i = " << *i << std::endl;  
    std::cout << "i = " << i << std::endl;  
    double *d=reinterpret_cast(i);  
    std::cout << "*d = " << *d << std::endl;  
    std::cout << "d = " << d << std::endl;  
      
    rC c;  
    std::cout << "&c = " << &c << std::endl  << "reinterpret_cast(&c) = " <<reinterpret_cast(&c) << std::endl  << "static_cast(&c) = " << static_cast(&c) << std::endl  << "reinterpret_cast(&c) = " <<reinterpret_cast(&c) << std::endl  << "static_cast(&c) = " << static_cast(&c) << std::endl  << std::endl;  
}  
      
int main (void)  
{  
    std::cout << std::endl << "常量性转除:" << std::endl;  
    CastConst();  
    std::cout << std::endl << "安详向下转型:" << std::endl;  
    CastDynamic();  
    std::cout << std::endl << "从头表明转型:" << std::endl;  
    CastReinterpret();  
}

输出:

常量性转除:  
s.value = 0  
s.value = 1  
s.value = 2  
      
安详向下转型:  
Derived::f  
Derived::g  
Derived::g  
Derived::g  
      
从头表明转型:  
*i = 10  
i = 0x471718  
*d = 2.55917e-307  
d = 0x471718  
&c = 0x22feb0  
reinterpret_cast(&c) = 0x22feb0  
static_cast(&c) = 0x22feb4  
reinterpret_cast(&c) = 0x22feb0  
static_cast(&c) = 0x22feb0

C语言/C++ 教程

2017-12-18


题目: 关于C++中, 四种范例转换的要害字, 的详解, 也可以给出代码, 判定输出 或 判定哪些代码有误. 谜底及典型如下: 四种要害字: const_cast, 常量性转除;dynam