//############################################################################
/*
* 显式类型转换
*
* 类型转换
* 1. 隐式
* 2. 显式 - Casting
*/ /*
* 1. static_cast
*/
int i = 9;
float f = static_cast<float>(i); // 将对象从一个类型转为另一个类型
dog d1 = static_cast<dog>(string("Bob")); // 需要定义类型转换函数
dog* pd = static_cast<dog*>(new yellowdog()); // 将指针/引用从一个类型转为一个相关的类型(down/up cast) /*
* 2. dynamic_cast
*/
dog* pd = new yellowdog();
yellowdog py = dynamic_cast<yellowdog*>(pd);
// a. 将指针/引用从一个类型转为一个相关的类型(down cast) 只能用于指针和引用,基本上用于基类转成派生类
// b. 运行时类型检查。如果成功, py==pd; 如果失败, py==0;
// c. 要求2个类型是多态的 (有虚函数). /*
* 3. const_cast
*/ // 只能用于指针和引用
const char* str = "Hello, world."; // 只能用于同一类型
char* modifiable = const_cast<char*>(str); // 去除所指的对象的const属性 /*
* 4. reinterpret_cast
*/
long p = 51110980;
dog* dd = reinterpret_cast<dog*>(p); // 重新解释所指对象的比特位
// 可以将指针转成任意其他类型的指针 /*
* C-Style Casting:
*/
short a = 2000;
int i = (int)a; // c-like cast表示法
int j = int(a); // 类函数表示法
// 是static_cast, const_cast and reinterpret_cast的混合 /*
* 更倾向于C++风格的转换,因为:
* 1. 更具倾向性,代码易于阅读
* 2. 更少的使用错误. C++风格提供:
* a. 每种转换具有更窄的目的
* b. 运行时检查能力
*/ /*
* 转换有风险
*
* dynamic_cast的例子:
*/
class dog {
public:
virtual ~dog() {}
}; class yellowdog : public dog {
int age;
public:
void bark() { cout<< "woof. I am " << age << endl; } //bark没有访问任何成员数据,编译器会试图将其解释为静态函数处理
}; int main() {
dog* pd = new dog();
yellowdog* py = dynamic_cast<yellowdog*>(pd); //运行时类型检查开销很大
py->bark(); //所以这里可以成功
cout << "py = " << py << endl;
cout << "pd = " << pd << endl;
...
} OUTPUT:
woof.
py = 0
pd = 57873400 /* 转换可以是一个方便的黑客工具 */ class dog {
public:
std::string m_name;
dog():m_name("Bob") {}
void bark() const { //*this is const
std::cout << "My name is " << m_name << std::endl;
}
}; // m_name = "Henry";
// const_cast<dog*>(this)->m_name = "Henry"; /* 【各类转换的比较】
* Generate_Code 转换是否会产生相当数据的可执行代码
* Generate_date 转换是否会产生不同的数据类型
* risky 风险等级
* data_type 可用于哪些类型
* ========================================= C++ 风格转换 ================================
* Generate_Code Generate_data risky data_type
* Object Casting:
* static_cast yes yes 2 any types
* (as long as type
* conversion is defined)
* Pointer/Reference Casting:
* static_cast no no 4 related types
* dynamic_cast yes no 3 related types(down-cast)
* const_cast no no 1 same type
* reinterpret_cast no no 5 any types
*
*
*
*
* ========================================= C 风格转换 ================================
* Generate_Code Generate_data risky data_type
* Object Casting: yes yes 5 any types
* (as long as type
* conversion is defined)
* Pointer/Reference Casting: no no 5 any types
*
*
*
*
* 注意:
* 1. const_cast, dynamic_cast和reinterpret_cast只能用于指针/引用
* 2. 对象的static_cast和指针的static_cast差别非常大
* 3. reinterpret_cast从比特上重新分配类型信息,用在低层的编码上
* 4. dynamic_cast相比static_cast加上了运行时类型检查
* 5. dynamic_cast和static_cast指针转换时只能转成有关的类型 (即, 基类 <-> 派生类之间转换).
*
*/ /* 使用多态最小化转换的使用
如下例子的转换,可以用多态实现
*/ class dog {
public:
virtual ~dog() {}
}; class yellowdog : public dog {
public:
void bark() { cout<< "Yellow dog rules! " << endl; }
}; int main() {
dog* pd = get_dog();
if (yellowdog *py = dynamic_cast<yellowdog*>(pd)) {
py->bark();
}
delete pd;
} /* 增加虚函数bark()*/ class dog {
public:
virtual ~dog() {}
virtual void bark() {}
}; class yellowdog : public dog {
public:
void bark() { cout<< "Yellow dog rules! " << endl; }
}; int main() {
dog* pd = get_dog();
pd->bark();
delete pd;
}

C++进阶--显式类型转换(casting)的更多相关文章

  1. C#中,使用显式类型转换(int)和Math.Round方法,将浮点数转换为整数的区别

    主要区别就是,显式类型转换(int)是将浮点数的整数部分截取出来,然后转换为整数,所以相当于是向下取整.而Math.Round方法是对浮点数进行四舍五入后,转换为整数. 新建一个.NET Core控制 ...

  2. C++显式类型转换

    C++显式类型转换 (注:本文例程改编自<C++ Primer>) 关于类型转换,C++保留了C语言中的类型转换方式,并提供了4中新的类型转换方式.<Effective C++> ...

  3. SQL进阶-隐式类型转换

    一.隐式类型转换 1.隐式类型转换 隐式类型转换: '; 程序可读性差,且依赖数据库的隐式转换规则,如果数据库升级,则程序可能无法正确执行: 有可能会导致索引失效: 有可能会导致意想不到的结果: 显式 ...

  4. C++进阶--隐式类型转换

    //############################################################################ /* 隐式类型转换 * * 类型转换可分为 ...

  5. javascript显式类型转换

    尽管js可以做许多自动类型转换,但某些时候仍然需要做显示类型转换或为了代码逻辑清晰易读而做显示类型转换. 做显示类型转换最简单的方法就是用Boolean().Number().String()或Obj ...

  6. JavaScript显式类型转换与隐式类型转换

    隐式类型转换 四则运算 判断语句 toString 在 JavaScript 中声明变量不需指定类型,对变量赋值也没有类型检查,同时还允许隐式类型转换. 这些特征说明 JavaScript 属于弱类型 ...

  7. C++中的显式类型转换

    一.学习总结 1.C++中额外提供的类型转换有 (1) reinterpret_cast: 格式:reinterpret_cast<type-id> (expression)①type-i ...

  8. C++学习之显式类型转换与运行时类型识别RTTI

    static_cast const_cast reinterpret_cast 运行时类型识别(RTTI) dynamic_cast 哪种情况下dynamic_cast和static_cast使用的情 ...

  9. Golang 类型转换,断言和显式强制转换

    1 前言 类型转换,可以用断言(只能使用在interface{}类型转换成其它类型)和显式类型强制转换(常规是用于基本类型) 2 代码 //graphql-go func(params graphql ...

随机推荐

  1. EasyUI datagrid combox onchange 五

    $("#sTwo").combobox({ onChange: function (n,o) { n改变后,o改变前 }

  2. ISCC的 Misc——WP

    比赛已经结束了,自己做出来的题也不是很多,跟大家分享一下 Misc 第一题:What is that? 下载链接; 打开 解压 是一个图片 因为分值很少所以题和简单 观察图片是一个向下指的手 说明fl ...

  3. 【HDOJ1529】【差分约束+SPFA+二分】

    http://acm.hdu.edu.cn/showproblem.php?pid=1529 Cashier Employment Time Limit: 2000/1000 MS (Java/Oth ...

  4. json(传输格式)、异步加载、时间线

    xml:过去传输的数据格式 json:现在的传输数据格式,属性名加双引号来区别,其实也是对象,传输的是个字符串,其实就是json 前端JSON.stringfy(obj) 然后传给后台 后台传回来的j ...

  5. if else的使用以及如何从键盘获取数值

    if-else的使用 顺序结构 顺序从上到下执行,中间没有判断和跳转 分支结构 根据条件,选择性地执行某段代码 有if-else和switch两种分支语句 循环结构 根据循环,重复性地执行某段代码 有 ...

  6. ionic局部刷新页面与刷新整个页面

    1.全局刷新,禁用缓存: 在app.js中设置cach:false,如下: .state('material', { url: '/material', cache:false, templateUr ...

  7. 小D课堂【SpringBoot】接口Http协议开发实战

    ---恢复内容开始--- ====================2.SpringBoot接口Http协议开发实战 ============================= 1.SpringBoot ...

  8. MogileFS-2.44 安装与配置

    MogileFS-2.44 安装与配置 (转:https://my.oschina.net/u/1259000/blog/182277) 目录 一.MogileFS 介绍 1.1.环境 二.Mogil ...

  9. ncm 让跨项目配置一致性简单的工具

    多团队写作,确保node 项目依赖以及配置一致性是比较难搞的,所以一些大型的团队 以及框架都是使用单体仓库的模式,比如lerna 等工具. ncm 借鉴了helm .mrm.kyt.yarn 等开发工 ...

  10. Makefile introduction (very old presentation)