您的位置:首页 > 编程语言 > C语言/C++

C++类型转换

2016-01-13 18:02 435 查看
转载请标明地址:/article/7555544.html

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

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

static_cast

一般的转换
dynamic_cast

通常在基类和派生类之间转换时使用


const_cast

主要针对 const 的转换

reinterpret_cast

用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数
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);


2.dynami_cast

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

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);


3.cosnt_cast

1.cosnt_cast 去掉类型中的常量性

2.const_cast 中的类型必须是指针、引用或指向对象类型成员的指针

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

Dog* dog1 =const_cast<Dog*>(dog);
dog1->a = 10;


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:程序员必须清楚的知道要转变的变量,转换前是什么类型,转换后是什么类型,以及转换后有什么后果。

结论 2:一般情况下,不建议类型转换,避免进行类型转换


以下贴上全部代码:

//
// 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_cast
void 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: