指针和对象存取数据成员有什么区别?
2016-03-24 13:24
288 查看
如果我们有两个定义:
用它们来存取data member,像这样:
通过origin存取,和通过pt存取,有什么重大差异么?
当Point3d是一个derived class,而其继承结构中有一个virtual base class,并且被存取的member(如本例中的x)是一个从该virtual base class继承而来的member时,就会有重大区别。
我们不知道编译时期这个member真正的offset位置,也就是说我们不直到pt必然指向哪一种class type,所以这个存取操作必须延迟至执行期,经由一个额外的间接导引,才能解决;但如果用origin,就不会有这些问题,其类型无疑是Point3d class,而即使它继承自virtual base class,members的offset位置也在编译时期就固定了。一个积极进取的编译器甚至可以静态地经由origin就解决掉对x的存取。
Point3d origin,*pt = &origin;
用它们来存取data member,像这样:
origin.x = 0.0; pt->x = 0.0
通过origin存取,和通过pt存取,有什么重大差异么?
当Point3d是一个derived class,而其继承结构中有一个virtual base class,并且被存取的member(如本例中的x)是一个从该virtual base class继承而来的member时,就会有重大区别。
我们不知道编译时期这个member真正的offset位置,也就是说我们不直到pt必然指向哪一种class type,所以这个存取操作必须延迟至执行期,经由一个额外的间接导引,才能解决;但如果用origin,就不会有这些问题,其类型无疑是Point3d class,而即使它继承自virtual base class,members的offset位置也在编译时期就固定了。一个积极进取的编译器甚至可以静态地经由origin就解决掉对x的存取。
相关文章推荐
- Alluxio源码分析定位策略:指定主机策略SpecificHostPolicy
- 判断对象是否相等---重写equals方法
- Git怎样撤销一次分支的合并Merge
- 【UVA11294】Wedding (2-SAT)
- 将Odoo设置为系统服务
- 48.Android中android studio导入ApiDemos 问题小结
- 关于Font的方法使用
- org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)错误解决方法
- 为什么a标签中使用img后的高度多了几个像素?(转)
- Android大图片裁剪终极解决方案 原理分析
- 操作系统-命令解释程序(实验一)
- 项目日志文件存放位置
- HRBUST 1188 区间最大值 I
- Leet Code OJ 20. Valid Parentheses [Difficulty: Easy]
- 非堵塞socket实现android手机与PC的文件传输
- mysql某些值统计
- Python爬虫
- Java核心知识点-Java多线程
- hdu 1548 A strange lift (BFS)
- 一个方法连续调用多次,但方法体里面的代码只保证最后一次的执行,之前连续调用的方法体都不执行