C++类型转换
2016-01-13 18:02
435 查看
转载请标明地址:/article/7555544.html
1.类型转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符。
2. c 风格的强制类型转换,不管什么是什么类型,统统都是 Type b = (Type)a; c++风格的类型转换提供了 4 种类型转换操作符来应对不同场合的的应用。
1.static_cast
2.dynami_cast
1.仅能应用于指针或者引用,不支持内置数据类型
2.它不仅仅像 static_cast那样,检查转换前后的两个指针是否属于同一个继承树
3.它还要检查被指针引用的对象的实际类型,确定转换是否可行。
3.cosnt_cast
1.cosnt_cast 去掉类型中的常量性
2.const_cast 中的类型必须是指针、引用或指向对象类型成员的指针
4.reinterpret_cast
任何指针都可以转换成其它类型的指针
总结:
结论 1:程序员必须清楚的知道要转变的变量,转换前是什么类型,转换后是什么类型,以及转换后有什么后果。
结论 2:一般情况下,不建议类型转换,避免进行类型转换
以下贴上全部代码:
1.类型转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符。
2. c 风格的强制类型转换,不管什么是什么类型,统统都是 Type b = (Type)a; c++风格的类型转换提供了 4 种类型转换操作符来应对不同场合的的应用。
static_cast | 一般的转换 |
dynamic_cast | 通常在基类和派生类之间转换时使用 |
const_cast | 主要针对 const 的转换 |
reinterpret_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;
}
相关文章推荐
- 关键路径问题--完美版
- 【C++入门】简单的日期类操作
- c 语言鞍点问题处理
- C++学习之拷贝构造函数篇
- C++ 强制转换函数const_cast,reinterpret_cast,static_cast,dynamic_cast
- C++new对象堆和栈
- C++笔记--返回对象还是返回引用
- C++11: Dynamic Memory
- Win7-64位系统中VC++ 6.0打开文件崩溃解决办法
- 在Ubuntu14.04下安装gcc 5.3.0解决C++11支持问题
- C++的list原创测试(push_back////remove),代码通过
- C++按值传递对象和传递引用的选择
- 用java的jni调用C语言的API,实现带图形界面的一元稀疏多项式计算器
- C++学习之对象成员篇
- C++内存泄露检查
- c++动态分配二维/三维数组的内存
- C++ 局部类
- C++ 嵌套类
- C语言通过逻辑运算(与或非)实现加法
- C++学习之对象数组篇