• C++中的类型转换


    类型转换有 c 风格的,当然还有 c++风格的。 c 风格的转换的格式很简单(TYPE) EXPRESSION,但是 c 风格的类型转换有不少的缺点,有的时候用 c 风格的转换是不合 适的,因为它可以在任意类型之间转换,比如你可以把一个指向const 对象的指针转换 成指向非 const 对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的 指针,这两种转换之间的差别是巨大的,但是传统c 语言风格的类型转换没有区分这 些。还有一个缺点就是,c 风格的转换不容易查找,他由一个括号加上一个标识符组成, 而这样的东西在 c++程序里一大。所以 c++为了克服这些缺点,引进了 4 新的类型转换操作符。

    static_cast 静态类型转换。
    reinterpreter_cast 重新解释类型转换。
    dynamic_cast 子类和父类之间的多态类型转换。
    const_cast 去掉const属性转换。

     

    static_cast

    #include <iostream>
    using namespace std;
    
    int main()
    {
        double d = 3.14;
        int num1 = (int)d;    //C语言的旧式类型转换
        int num2 = d;    //隐式类型转换
        int num3 = static_cast<int> (d);    //静态类型转换
        cout<<"d: "<<d<<", "<<"num1: "<<num1<<", "<<"num2: "<<num2<<", "<<"num3: "<<num3<<endl;
        return 0;
    }
    View Code

    dynamic_cast 子类和父类之间的多态类型转换

    用于多态中的父子类之间的强制转化。

    #include <iostream>
    using namespace std;
    
    class Base
    {
    public:
        virtual void print() = 0;
    };
    
    class A: public Base
    {
    public:
        virtual void print()
        {
            cout<<"I am A"<<endl;
        }
    };
    
    class B: public Base
    {
    public:
        virtual void print()
        {
            cout<<"I am B"<<endl;
        }
    };
    
    int main()
    {
        Base *base = NULL;
        base = new A();    
        base->print();
    
        B *b = dynamic_cast<B *> (base);    //将父类指针转化为子类指针B,但是由于父类指针原来指向的是A,所以转换失败返回空指针
        if(b == NULL)
        {
            cout<<"b is NULL"<<endl;
        }
    
        A *a = dynamic_cast<A *> (base);    //将父类指针转化为子类指针A
        if(a != NULL)
        {
            a->print();
        }
    
        return 0;
    }
    View Code

  • 相关阅读:
    [转载]重构代码的7个阶段
    查看JDK源码
    敏捷结果30天之第七天:设定边界值和缓冲
    敏捷结果30天之第十一天:高效能、慢生活
    他们到底需要神马???——戏说“用户需求”
    敏捷结果30天之第一天:总体认识敏捷结果方法
    敏捷结果30天之第五天:使用热图标识出重要事情
    重构代码学习笔记一:重构的原则
    开发可统计单词个数的Android驱动程序(2)
    使用Android NDK和Java测试Linux驱动
  • 原文地址:https://www.cnblogs.com/xumaomao/p/12976046.html
Copyright © 2020-2023  润新知