C++编程进阶4(C++中的强制类型转换运算符、不要返回自定义类内部成员的指针,引用和迭代器)
十五、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
参考
《Effective C++》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
C++编程进阶4(C++中的强制类型转换运算符、不要返回自定义类内部成员的指针,引用和迭代器)相关推荐
- C++编程进阶8(最好不要实现类型转换运算符、单形参的构造函数与类型转换、临时对象与RVO)
二十九.最好不要实现类型转换运算符 示例代码 class fraction { public:fraction(int numerator=0, int denominator=1);operator ...
- 在python中定义类时、运算符重载_python自定义类运算符重载
假设我有一个班级: class Cat: def __init__(self, name = "default", age = 0): self.name = name self. ...
- c语言运算符类型转换,C语言中强制类型转换运算符的独特作用
C语言中强制类型转换运算符的独特作用 在C语言中有一个强制类型转换运算符,它为C语言中的数据类型转换带来 (本文共2页) 阅读全文>> 在进行C++类的设计时,我们常常需要为类对象设计运算 ...
- [强制类型转换]C语言中的强制类型转换相关
问题描述:C语言中的强制类型转换许多时候是隐式的,而在未注意时很可能代码会进行隐式转换而造成运行结果不正确.因此打算对C语言的类型转换做下整理和学习,发现这篇文章总结的很好,于是转载下来,原文地 ...
- C语言中的强制类型转换
强制类型转换是把变量从一种类型转换为另一种数据类型.例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型.您可以使用强制类型转换运算符来把值显 ...
- AS3中的强制类型转换
转自http://www.zhuoqun.net/html/y2007/654.html 每一种编程语言都提供强制类型转换,允许你将某一种数据类型转换成另一种数据类型,AS3自然也不例外.但是虽然我编 ...
- (计算机组成原理)第二章数据的表示和运算-第二节7:详解C语言中的强制类型转换
文章目录 (1)无符号数和有符号数 (2)长整数变为短整数 (3)短整数变为长整数 在学习完前面几节的内容后,相信大家对数据是如何在计算机中存储.运算的有了更加深入的认识,那么接下来我们就以更深层次的 ...
- 区分一下强制类型转换运算符重载/赋值运算符重载/对象定义的赋值
这三个名字可能很绕,看着也很不一样,但其实是三个很容易混淆的概念,并且经常在实际编程中遇到.这里拿出来比较一下. 首先是强制类型转换运算符的重载,作用是当前对象向其他类型的转换,常见的形式是 oper ...
- 重载new、delete和强制类型转换运算符()
1.重载new和delete运算符 内存管理运算符new.new[].delete和delete[]也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就 ...
最新文章
- “三巨头”联合发布万字长文,深度学习将通往何方?
- 动态代理及工厂的简单实现
- WTL中CMemDC与CDC、CDCHandle的联系
- 前后端数据交互方法 汇总
- 明星+本土化,vivo国际化的两大开路先锋
- Cocos Creator 编辑器扩展
- 2021华为软件精英挑战赛的baseLine,Java版,仅供参考,无核心算法
- 北斗文档下载工具-百度文库文档每天免费2次机会下载
- C++ 万年历、生肖判断、计算第几天
- Easy Mobile插件之Advertising
- 开源的工作流都有哪些特征?
- 什么是Windows能干而Linux干不了的
- Apriori 、FP-Growth 和 Eclat 3 种经典的 ARM (关联规则挖掘)算法--自用
- 瞬间把自己家里的ipad或华为平板、手机变成电脑副屏
- 74LS273芯片介绍
- BIM研究-基于HTML5/WebGL技术的BIM模型轻量化Web浏览解决方案
- Java模拟实现KFC点餐系统
- 【安全知识分享】PPTX|防触电及安全用电培训课件(39页)(附下载)
- 短视频素材在哪找?3大素材库,3000+最火视频素材免费用
- 抓球球的机器人应该怎么玩_一款FTC科技挑战赛抓球机器人的程序设计
热门文章
- Asp.Net 上传大文件
- DAVID-GO-记录
- Microsoft Visual C++ 14.0 is required
- Excel如何快速清除单元格所有内容
- where()函数的用法
- (字符串的处理4.7.22)POJ 3337 Expression Evaluator(解析C风格的字符串)
- 2018-2019-2 网络对抗技术 20165301 Exp3 免杀原理与实践
- pandas 2 选择数据
- 35岁前十件事该做好
- 技巧.自己学会取名字,学会欣赏