十五、C++中的强制类型转换

C语言中的强制类型转换方式有两种

T i = (T)exp; T i = T(exp);

这两种方式没有差别,C++中也支持这两种方式,但是和C++中的强制类型转换运算符对比,不太容易识别,作用范围不细化。所以,C++中就有了const_cast、dynamic_cast、reinterpret_cast和static_cast四个强制类型转换运算符

1、const_cast和static_cast

https://blog.csdn.net/Master_Cui/article/details/106391914

2、static_cast的注意事项

class base
{
public:base():data(0){cout<<__func__<<endl;}~base(){cout<<__func__<<endl;}void func(){cout<<"func in base"<<endl;data=10;}int data;
};class derive:public base
{
public:derive(){cout<<__func__<<endl;}~derive(){cout<<__func__<<endl;}void func() {cout<<"func in derive"<<endl;static_cast<base>(*this).func();cout<<base::data<<endl;}
};int main(int argc, char const *argv[])
{derive d;d.func();
}

根据输出结果可以看到,调用子类中的func后,基类中的data的值并没有发生变化,原因是因为static_cast<base>(*this)产生的只是个this的临时变量,当调用完func后,临时变量被释放,修改的也只是this临时对象中的data,所以this中的data数据不变

2.1、解决办法有两种

2.1.1、修改L20

static_cast<base&>(*this)
dynamic_cast<base&>(*this)

上述两种修改方式都可以

2.1.2、直接指定作用域调用基类中的func

base::func()

两种办法的最终输出结果如下

3、dynamic_cast

https://blog.csdn.net/Master_Cui/article/details/110520918

4、reinterpret_cast

reinterpret_cast是强制类型转换符用来处理无关类型转换的。比如任意类型的指针或引用之间的转换,指针和int型之间的转换,int到指针的转换。

示例

long Hash(void *p) {long val = reinterpret_cast<long>(p);return val ^ (val >> 16);
}int main(int argc, char const *argv[])
{int a[5];for (int i=0;i<5;++i) {cout<<Hash(a+i)<<endl;}
}

注意,上述代码中的hash函数的返回值以及val的类型的sizeof必须和指针的sizeof一样,否则会导致指针的字节数缩窄,无法编译通过

64位系统指针的字节数是8,32为系统指针的字节数是4,所以,使用了reinterpret_cast的代码不可移植

十六、对于get接口,不要返回对象private和protected数据的指针、引用和迭代器

自定义一个类时,类可能会有很多private和protected的成员,外部如果想访问这些内部的数据,那么就需要通过类提供的public的get接口来访问,get接口的返回值一般是按值返回,如果按引用返回或者返回一个指针,那么外部的使用者就可以对内部的数据成员进行修改,会破坏private和protected的封装性。

但是并不使所有的接口都不能返回内部数据的指针或引用,如果真的需要返回一个内部数据成员的指针或者引用,那么需要添加一个底层const

具体示例见https://blog.csdn.net/Master_Cui/article/details/112624465https://blog.csdn.net/Master_Cui/article/details/113001297

参考

《Effective C++》

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

C++编程进阶4(C++中的强制类型转换运算符、不要返回自定义类内部成员的指针,引用和迭代器)相关推荐

  1. C++编程进阶8(最好不要实现类型转换运算符、单形参的构造函数与类型转换、临时对象与RVO)

    二十九.最好不要实现类型转换运算符 示例代码 class fraction { public:fraction(int numerator=0, int denominator=1);operator ...

  2. 在python中定义类时、运算符重载_python自定义类运算符重载

    假设我有一个班级: class Cat: def __init__(self, name = "default", age = 0): self.name = name self. ...

  3. c语言运算符类型转换,C语言中强制类型转换运算符的独特作用

    C语言中强制类型转换运算符的独特作用 在C语言中有一个强制类型转换运算符,它为C语言中的数据类型转换带来 (本文共2页) 阅读全文>> 在进行C++类的设计时,我们常常需要为类对象设计运算 ...

  4. [强制类型转换]C语言中的强制类型转换相关

       问题描述:C语言中的强制类型转换许多时候是隐式的,而在未注意时很可能代码会进行隐式转换而造成运行结果不正确.因此打算对C语言的类型转换做下整理和学习,发现这篇文章总结的很好,于是转载下来,原文地 ...

  5. C语言中的强制类型转换

    强制类型转换是把变量从一种类型转换为另一种数据类型.例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型.您可以使用强制类型转换运算符来把值显 ...

  6. AS3中的强制类型转换

    转自http://www.zhuoqun.net/html/y2007/654.html 每一种编程语言都提供强制类型转换,允许你将某一种数据类型转换成另一种数据类型,AS3自然也不例外.但是虽然我编 ...

  7. (计算机组成原理)第二章数据的表示和运算-第二节7:详解C语言中的强制类型转换

    文章目录 (1)无符号数和有符号数 (2)长整数变为短整数 (3)短整数变为长整数 在学习完前面几节的内容后,相信大家对数据是如何在计算机中存储.运算的有了更加深入的认识,那么接下来我们就以更深层次的 ...

  8. 区分一下强制类型转换运算符重载/赋值运算符重载/对象定义的赋值

    这三个名字可能很绕,看着也很不一样,但其实是三个很容易混淆的概念,并且经常在实际编程中遇到.这里拿出来比较一下. 首先是强制类型转换运算符的重载,作用是当前对象向其他类型的转换,常见的形式是 oper ...

  9. 重载new、delete和强制类型转换运算符()

    1.重载new和delete运算符 内存管理运算符new.new[].delete和delete[]也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就 ...

最新文章

  1. “三巨头”联合发布万字长文,深度学习将通往何方?
  2. 动态代理及工厂的简单实现
  3. WTL中CMemDC与CDC、CDCHandle的联系
  4. 前后端数据交互方法 汇总
  5. 明星+本土化,vivo国际化的两大开路先锋
  6. Cocos Creator 编辑器扩展
  7. 2021华为软件精英挑战赛的baseLine,Java版,仅供参考,无核心算法
  8. 北斗文档下载工具-百度文库文档每天免费2次机会下载
  9. C++ 万年历、生肖判断、计算第几天
  10. Easy Mobile插件之Advertising
  11. 开源的工作流都有哪些特征?
  12. 什么是Windows能干而Linux干不了的
  13. Apriori 、FP-Growth 和 Eclat 3 种经典的 ARM (关联规则挖掘)算法--自用
  14. 瞬间把自己家里的ipad或华为平板、手机变成电脑副屏
  15. 74LS273芯片介绍
  16. BIM研究-基于HTML5/WebGL技术的BIM模型轻量化Web浏览解决方案
  17. Java模拟实现KFC点餐系统
  18. 【安全知识分享】PPTX|防触电及安全用电培训课件(39页)(附下载)
  19. 短视频素材在哪找?3大素材库,3000+最火视频素材免费用
  20. 抓球球的机器人应该怎么玩_一款FTC科技挑战赛抓球机器人的程序设计

热门文章

  1. Asp.Net 上传大文件
  2. DAVID-GO-记录
  3. Microsoft Visual C++ 14.0 is required
  4. Excel如何快速清除单元格所有内容
  5. where()函数的用法
  6. (字符串的处理4.7.22)POJ 3337 Expression Evaluator(解析C风格的字符串)
  7. 2018-2019-2 网络对抗技术 20165301 Exp3 免杀原理与实践
  8. pandas 2 选择数据
  9. 35岁前十件事该做好
  10. 技巧.自己学会取名字,学会欣赏