【C++基础】C++类型转换(一)

来源:互联网 发布:知乎 胸下夹笔福利 编辑:程序博客网 时间:2024/06/03 20:52

   我是小毛驴,转载请注明出处:http://blog.csdn.net/liulongling/article/details/50512364

 一、类型转换


  1.类型转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符。

  2. C风格的强制类型转换,不管什么是什么类型,统统都是 Type b = (Type)a; c++风格的类型转换提供了 4 种类型转换操作符来应对不同场合的的应用。

关键字说明static_cast 一般的转换dynamic_cast 通常在基类和派生类之间转换时使用const_cast 主要针对 const 的转换 reinterpret_cast 用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数

   1.1 static_cast 

  double a = 3.1415;    //1基础类型转换,可隐式类型转换都可用 static_cast    int a1 = static_cast<int>(a);        //2.指针类型 不相关类型转换失败    char * b = "awdwdw";    //int b1 =static_cast<int*>(b);        //3.基类指针和子类指针转换    //父类指针转成子类指针(不安全)    Hourse* h = new Hourse;    BookRoom* bookroom = static_cast<BookRoom*>(h);        //子类指针转换为父类指针 (安全)    BookRoom* bookRoom = new BookRoom;    Hourse* hourse  =static_cast<Hourse*>(bookRoom);        //4引用类型转换    Hourse hourse1;    Hourse& hourse2 = hourse1;        BookRoom& br = static_cast<BookRoom&>(hourse2);

   1.2 dynami_cast

  • c仅能应用于指针或者引用,不支持内置数据类型
  • 它不仅仅像 static_cast那样,检查转换前后的两个指针是否属于同一个继承树
  • 它还要检查被指针引用的对象的实际类型,确定转换是否可行。

double a = 3.1415;    //1.转换内置数据类型失败    //int a1 = dynamic_cast<int>(a);        //2.转换父子关系    Hourse* h = new BookRoom;    //父类指针转化为子类指针失败    //BookRoom* b = dynamic_cast<BookRoom*>(Hourse);        BookRoom* br = new BookRoom;    //子类指针转换为父类指针 成功    Hourse* hourse = dynamic_cast<Hourse*>(br);        //不同类型指针转换 失败    Hourse* hourse1 = new Hourse;    // Dog* dog = dynamic_cast<Dog*>(hourse1);        //引用转换    BookRoom br1;    BookRoom& br2 = br1;        Hourse& hourseBean = dynamic_cast<Hourse&>(br1);

   1.3 cosnt_cast

  • cosnt_cast 去掉类型中的常量性
  • const_cast 中的类型必须是指针、引用或指向对象类型成员的指针 

   //对象指针    const Dog* dog= new Dog;    // dog->a = 10;//const 修饰不可以修改        Dog* dog1 =const_cast<Dog*>(dog);    dog1->a = 10;

   1.4 reinterpret_cast 

任何指针都可以转换成其它类型的指针

typedef void(*FUNCPTR1)(int,int);typedef int(*FUNCPTR2)(char);void test04(){    //1.转化基础数据类    int a = 10;    //转换失败    //char b = reinterpret_cast<char>(a);         //2.指针类型转换    Hourse* h = new Hourse;    Dog* dog = reinterpret_cast<Dog*>(h);        //3.函数指针转换    FUNCPTR1 fun1 = NULL;    FUNCPTR2 fun2 = reinterpret_cast<FUNCPTR2>(fun1);        //4.转换引用    int a1 = 10;    int &b = a1;    char&c = reinterpret_cast<char&>(b);    c = 'a';    }

   1.5 总结

  • 程序员必须清楚的知道要转变的变量,转换前是什么类型,转换后是什么类型,以及转换后有什么后果。
  • 一般情况下,不建议类型转换,避免进行类型转换

 二、全部代码

////  main.cpp//  STL三大组件////  Created by 刘龙玲 on 16/5/3.//  Copyright © 2016年 liulongling. All rights reserved.//#include <iostream>using namespace std;class Hourse{public:    private:    string address;};class BookRoom:public Hourse{    };class Dog{public:    int a;};//static_castvoid test01(){    double a = 3.1415;    //1基础类型转换,可隐式类型转换都可用 static_cast    int a1 = static_cast<int>(a);        //2.指针类型 不相关类型转换失败    char * b = "awdwdw";    //int b1 =static_cast<int*>(b);        //3.基类指针和子类指针转换    //父类指针转成子类指针(不安全)    Hourse* h = new Hourse;    BookRoom* bookroom = static_cast<BookRoom*>(h);        //子类指针转换为父类指针 (安全)    BookRoom* bookRoom = new BookRoom;    Hourse* hourse  =static_cast<Hourse*>(bookRoom);        //4引用类型转换    Hourse hourse1;    Hourse& hourse2 = hourse1;        BookRoom& br = static_cast<BookRoom&>(hourse2);    }//dynami_cast//仅能应用于指针或者引用,不支持内置数据类型//它不仅仅像 static_cast 那样,检查转换前后的两个指针是否属于同一个继承树//它还要检查被指针引用的对象的实际类型,确定转换是否可行。void test02(){    double a = 3.1415;    //1.转换内置数据类型失败    //int a1 = dynamic_cast<int>(a);        //2.转换父子关系    Hourse* h = new BookRoom;    //父类指针转化为子类指针失败    //BookRoom* b = dynamic_cast<BookRoom*>(Hourse);        BookRoom* br = new BookRoom;    //子类指针转换为父类指针 成功    Hourse* hourse = dynamic_cast<Hourse*>(br);        //不同类型指针转换 失败    Hourse* hourse1 = new Hourse;    // Dog* dog = dynamic_cast<Dog*>(hourse1);        //引用转换    BookRoom br1;    BookRoom& br2 = br1;        Hourse& hourseBean = dynamic_cast<Hourse&>(br1);}//cosnt_cast 去掉类型中的常量性//const_cast 中的类型必须是指针、引用或指向对象类型成员的指针void test03(){    //对象指针    const Dog* dog= new Dog;    // dog->a = 10;//const 修饰不可以修改        Dog* dog1 =const_cast<Dog*>(dog);    dog1->a = 10;}typedef void(*FUNCPTR1)(int,int);typedef int(*FUNCPTR2)(char);void test04(){    //1.转化基础数据类    int a = 10;    //转换失败    //char b = reinterpret_cast<char>(a);         //2.指针类型转换    Hourse* h = new Hourse;    Dog* dog = reinterpret_cast<Dog*>(h);        //3.函数指针转换    FUNCPTR1 fun1 = NULL;    FUNCPTR2 fun2 = reinterpret_cast<FUNCPTR2>(fun1);        //4.转换引用    int a1 = 10;    int &b = a1;    char&c = reinterpret_cast<char&>(b);    c = 'a';    }int main(){    test01();    test02();    test03();    test04();    return 1;}


0 0
原创粉丝点击