C++中四种类型装换

1、类型转换

  static_cast<>():静态类型转换,编译时C++编译器会做类型检查,在C语言中,隐式类型转换的地方,均可以使用static_cast<>()进行类型转换;

  reinterpret_cast<>():强制类型转换;编译器重新解释;

  dynamic_cast<Cat *>(base):父类对象===>子类对象,向下转型,一般用在继承中;

  const_cast<>():const char *---> char *,把常量属性去掉;

(1)、代码如下:

#include<iostream>
using namespace std;

class Animal{
    public:
        virtual void cry() = 0;
};

class Dog : public Animal{
    public:
        virtual void cry(){
            cout<<"汪王"<<endl;
        }   
        void doHome(){
            cout<<"看家"<<endl;
        }   
    private:

};

class Cat : public Animal{
    public:
    virtual void cry(){
        cout<<"喵喵"<<endl;
    }   
    void doThing(){
        cout<<"抓老鼠"<<endl;
    }
    private:
};

void playObj(Animal *base){
    base->cry();   //1、有继承 2、有虚函数的重写 3、有父类指针指向子类对象; ===>发生多态
    //dynamic_cast能识别子类对象,运行时类型识别;
    Dog *pDog = dynamic_cast<Dog *>(base);  //是自己类型的,将转换成功,否则返回为NULL;
    if(pDog){
        pDog->doHome();   //让狗做自己特有的工作;
    }
    Cat *pCat = dynamic_cast<Cat *>(base);//父类对象===>子类对象,向下转型;
    if(pCat){
        pCat->doThing();   //让猫做自己特有的工作;
    }
}

int main(void){
    Dog d1;
    Cat c1;

    playObj(&d1);
    playObj(&c1);

    //Animal *base = NULL;     
    //base = static_cast<Animal *>(&d1);

    return 0;
}
/*
int main(void){
    double pi = 3.14;

    int num2 = static_cast<int>(pi); //静态类型转换,编译时C++编译器会做类型检查,在C语言中,隐式类型转换
的地方,均可以使用static_cast<>()进行类型转换;

    char *p1 = "abcdef";
    int *p2 = NULL;
    //p2 = static_cast<int*>(p1); //使用static_cast,编译器编译时,会做类型检查,若有错误,提示错误;
    p2 = reinterpret_cast<int *>(p1);// 强制类型转换;编译器重新解释
    cout<<p1<<endl;
    cout<<p2<<endl; //%d

    return 0;
}

*/

运行结果:

(2)、针对const_cast<char *>(p)的类型转换代码:

#include<iostream>
using namespace std;

void printBuf(const char *p){
    //p[1] = ‘1‘;
    char *p1 = NULL;
    p1 = const_cast<char *>(p);//const char *---> char *,把常量属性去掉;
    p1[0] = ‘Z‘;
    cout<<p<<endl;
}

int main(void){
    const char buf[] = "abcdefg";
    //程序员要确保p所指向的空间确实能修改,如果不能修改将会带来灾难性的后果;
    //const char *buf = "abcdef";//会发生断错误;因为其所指向的空间本身不可修改
    printBuf(buf);

    return 0;
}

运行结果:

时间: 2024-08-26 02:16:24

C++中四种类型装换的相关文章

C#中方法的参数的四种类型

C#中方法的参数有四种类型: 1. 值参数类型  (不加任何修饰符,是默认的类型) 2. 引用型参数  (以ref 修饰符声明) 3. 输出型参数  (以out 修饰符声明) 4. 数组型参数  (以params 修饰符声明) =================================================== 1. 值传递: 值类型是方法默认的参数类型,采用的是值拷贝的方式.也就是说,如果使用的是值类型,则可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值.使用

领域模型中的实体类分为四种类型:VO、DTO、DO、PO

http://kb.cnblogs.com/page/522348/ 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来. DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布

转:领域模型中的实体类分为四种类型:VO、DTO、DO、PO

经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实际应用情况两个角度,对这几个概念进行简析.得出的主要结论是:在项目应用中,VO对应于页面上需要显示的数据(表单),DO对应于数据库中存储的数据(数据表),DTO对应于除二者之外需要进行传递的数据.一.实体类百度百科中对于实体类的定义如下:实体类的主要职责是存储和管理系统内部的信息,它也可以有行为,甚至很复杂的行为,但这些行为必须与它所代表的实体对象密切相关.根据以上定义,我们可以了解到,实体类有两方面内容,存储数据和执行

原生函数和强制类型装换

var a = new String("abc"); console.log(typeof a); //是Object,而不是string 使用new String("abc"); 创建的是字符串 abc 的封装对象,而不是基本类型值"abc". 封装对象 由于基本类型值没有.length和.toString()这样的属性和方法,需要通过封装对象才能访问,此时JavaScript会自动为基本类型值包装一个封装对象,如: var a = "

android在代码中四种设置控件背景颜色的方法(包括RGB)

转载请注明出处: http://blog.csdn.net/fth826595345/article/details/9208771  TextView tText=(TextView) findViewById(R.id.textv_name); //第1种: tText.setTextColor(android.graphics.Color.RED);//系统自带的颜色类 // 第2种: tText.setTextColor(0xffff00ff);//0xffff00ff是int类型的数据

四种类型的文法总结

这是有关编译原理的. 乔姆斯基体系是计算机科学中刻画形式文法表达能力的一个分类谱系,是由诺姆·乔姆斯基于1956年提出的.它包括四个层次: 0-型文法(无限制文法或短语结构文法)包括所有的文法.该类型的文法能够产生所有可被图灵机识别的语言.可被图灵机识别的语言是指能够使图灵机停机的字串,这类语言又被称为递归可枚举语言.注意递归可枚举语言与递归语言的区别,后者是前者的一个真子集,是能够被一个总停机的图灵机判定的语言. 1-型文法(上下文相关文法)生成上下文相关语言.这种文法的产生式规则取如 αAβ

sprint.net(2) AOP面向切面编程,spring.net的环绕通知;Spring.net的AOP通知的四种类型

AOP 有点类似于我们MVC里面的Filter过滤器,例如在MVC里面,如果给一个Action上打一个标签,就可以在这个Action执行之前或者之后,额外的执行一个方法,这个就相当于是面向切面编程. 无侵入式的. (也就是在不改变原来的代码的情况下,来跳转到一个其他的方法,执行完毕后回到主方法..),但是spring.net的AOP更牛叉,只需要在xml里面配置,就可以了,不需要在方法上面打特性的标签,也不需要继承什么类(例如MVC的过滤器是继承了ActionFilterAttribute) 主

[转]C++中四种类型转换符的总结

C++中四种类型转换符的总结 一.reinterpret_cast用法:reinpreter_cast<type-id> (expression)    reinterpret_cast操作符修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换,即二进制值没有变.例如: int n=9; double d= reinterpret_cast< double > (n); 在进行计算以后, d 包含无用值. 这是因为 reinterpret_cast 仅仅是复

JavaScript中两种类型的全局对象/函数(转)

转自:http://www.cnblogs.com/snandy/archive/2011/03/19/1988626.html 这里所说的JavaScript指浏览器环境中的包括宿主环境在内的.第一种是ECMAScript Global Object,第二种是宿主环境(Host)下的全局对象/函数. 一.核心JavaScript内置对象,即ECMAScript实现提供的不依赖于宿主环境的对象 这些对象在程序执行之前就已经(实例化)存在了.ECMAScript称为The Global Objec