//############################################################################
/*
* 显式类型转换
*
* 类型转换
* 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. 【重要】NOI-1.2-10-字符串大小

    10:Hello, World!的大小 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 还记得在上一章里,我们曾经输出过的“Hello, World!”吗? ...

  2. jquery选择后代以及toggle,toggleClass用法

    $("#id").find(".classname")      选择id为xx下的类名为xx的元素 toggle  $(this).next(".c ...

  3. Atom编辑神器

    最近喜欢上了Atom编辑神器,安装就不说了,重点讲配置. 一:软件配置 1.先将欢迎界面去掉,每次打开Atom的时候都会出现,实在是很烦人. 就在欢迎界面里面有个复选框,去掉选中就可以了. 2.让At ...

  4. linux---三剑客

    linux的三剑客分别为awk/sed/grep,是运维人员必不可少的常用命令. 一:awk取列 awk ‘{print $1 “ ” $2}’ old.txt awk /aaa/ old.txt 二 ...

  5. ionic后台返回的数据是html模板的时候,解析html文件的方法:

    1.后台返回来的数据格式是: { "state":"100", "data":[ {"Content": "\ ...

  6. Easyui combobox下拉框默认选中第一项

    var val = $(#cc).combobox("getData");for (var item in val[0]) {       if (item == "gr ...

  7. Nginx配置基于ip的虚拟主机

    我是在centos7虚拟机上进行实验的 该实验基于添加好ip的基础上,如何给网卡添加ip请查阅我的博客 先来看一下我的ip [root@localhost nginx]# ifconfig ens33 ...

  8. PHP用curl发送get post put delete patch请求

    function getUrl($url){ $headerArray = array("Content-type:application/json;", "Accept ...

  9. C# 远程调用实现案例

    C#远程调用实现案例 2007年11月19日 13:45:00 阅读数:6012 C#实现远程调用主要用到“System.Runtime.Remoting”这个东西.下面从三个方面给于源码实例. ·服 ...

  10. 海思HI3518由于sensor对齐方式问题导致视频花屏

    https://blog.csdn.net/faihung/article/details/70306446 前几天在验证一台IPC硬件时,遇到一个问题:在其它设备上视频功能运行正常的固件,烧录到客户 ...