3.1 Data Member的绑定
|
文章开始提出了一段示例代码,并讨论了返回哪个x的问题。然后
a) 给出了我们普遍认为正确的回答,并肯定了这个想法; b) 提醒大家,这在以前的编译器实现中,并非正确。 在早期的实现中,首先绑定的是“全局变量x”。因为该class中的x的声明尚未可见。由此导致的就是“防御性编程风格”。总结起来,具体做法有两种。 c) 将所有的data member的声明提前; d) 将内联函数的实现移至class的声明之外。 对于第一点,我们容易理解。因为变量的声明中,较晚的声明总是可以覆盖之前的。我想说下自己对于第二点的理解。 书中将此称为“member rewriting rule”。基本意义是,内联函数的实体,在整个class未被声明完全时,是不会被evaluate的(书中将evaluated翻译为评估求值,我个人觉得不是很恰当,我也没有想出什么更好的翻译,还是用英文表意更准确一点;还有后文的resolve,翻译为“决议”也不是很通顺,觉得“解析”更好)。也即是说,内联函数内的数据成员绑定也是在要class声明之后进行的。这个意义被C++Standard提炼为“member scope resolution rules”(成员作用域解析规则)。这是书里的说法。在程序中的效果是,如果内联函数在类声明后立即展开的话,它就会被evaluate。 当然上述规则也有失效的时候,比如,成员函数的参数列表。他们遵循的规则是“第一次遇到时,被适当的决议完成”。之后作者说,“extern和nested type names之间的非直觉绑定还是会发生”。目测这句话的意思是,此时会将“nested type names”解析为extern类型。这可以用书中的实例代码来引证。 在length的定义出现之前,它被使用了两次。结果是length被认为是extern类型,符合上述分析。而之后,length的声明出现时,前述解析会被否定。原文提到,“C++ Standard把稍早的绑定标示为非法”。此句意义不甚明确。标示为非法是什么意思?编译不通过,还是编译通过,但是增加了编译的开销(因为先认为length是一种类型,但是后来的声明使得原来的判定是错误的,而要重新解析)。对于这种情况,作者建议使用防御性编程风格,这也就是说建议,将data member的声明提前到使用之前。从这一点看,是不是可以认为C语言的编程方式更为科学? |
3.1 Data Member的绑定的更多相关文章
- Effective C# 学习笔记(原则一:始终能的使用属性(property),而不是可直接访问的Data Member)
原则一:始终能的使用属性(property),而不是可直接访问的Data Member Always use properties instead of accessible data memb ...
- C++ Data Member内存布局
如果一个类只定义了类名,没定义任何方法和字段,如class A{};那么class A的每个实例占用1个字节的内存,编译器会会在这个其实例中安插一个char,以保证每个A实例在内存中有唯一的地址,如A ...
- warning: in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions]
struct test{int a=1111111; }test; vincentdeMacBook-Air:datasturte vincent$ g++ struct.cpp -o structp ...
- 始终使用属性(Property),而不是字段(Data Member)
1.始终使用属性(Property),而不是字段(Data Member) C# 属性已经晋升为一等公民,如果你的类中还有public的字段,Stop.访问属性和字段的方式是一样的,但是属性是用方法( ...
- Data Member Order
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-member-order In some appl ...
- WPF使用附加属性绑定,解决data grid列绑定不上的问题
背景 需要对datagrid的列header添加自定义属性,然后绑定,并根据不同的列header绑定不同的值,传统的加扩展类太麻烦,而附加属性的特点更适用于这种场景. 1.xaml 代码 <Da ...
- 《深度探索c++对象模型》chapter3 Data语意学
一个空的class:如 class X{} ; sizeof(X)==1; sizeof为什么为1,他有一个隐晦的1 byte,那是被编译器安插进去的一个char,这使得class2的两个object ...
- Data 语义学(1)
一.Data Member 的绑定(The binding of Data Member) extern float x; class Point3d { public: Point3d( float ...
- c++对象模型之Data布局
Data语意学 class X{}; class Y : publicvirtual X {}; class Z : publicvirtual X {}; class A : publicY, pu ...
随机推荐
- 爬虫代码实现五:解析所有分页url并优化解析实现类
如图,我们进入优酷首页,可以看到电视剧列表,我们称这个页面为电视剧列表页,而点击进入某个电视剧,则称为电视剧详情页.那么如何获取所有分页以及对应的详情页呢,通过下面的分页得到. 因此,首先,我们将St ...
- (89c51)16x16点阵屏幕的实现
基本组件是一个51单片机,一个74154译码器,四个MATRIX-8X8. 考虑到单片机引脚有限,所以使用P0口和P2口的总共16根引脚选择列,而P1口的低4位接译码器,译出的一个低电平选择行.所以图 ...
- asp.net mvc 上传下载文件的几种方式
view: <!DOCTYPE html> <html> <head> <meta name="viewport" content=&qu ...
- 压测软件-Tsung.安装篇
author :James,jimingsong@vip.qq.com author :James,jimingsong@vip.qq.com since :2015-03-02 tsung介绍 ts ...
- git config
use following command to see the current config: $ git config --list use following command to config ...
- js实现的笛卡尔乘积-商品发布
//笛卡儿积组合 function descartes(list) { //parent上一级索引;count指针计数 var point = {}; var result = []; var pIn ...
- C#调用托管C++类(DLL)
毕设是做一个网络摄像头的相关应用.界面用WPF,图像处理部分是OpenCV.没用EmguCV的原因是国内EmguCV的资料相对比较少,EmguCV虽然提供了Winform的控件,在做UI上有一定优势, ...
- MyBatis面对Oracle数据库如何实现主键列自增长
因为Oracle数据库而言 不能够像SqlServer和MySql一样主键自增 而且MyBatis也没有提供直接的主键自增方法 所以我们自己使用查询语句来实现自增 实现代码: <insert i ...
- ssh无密码登录设置方法以及出现问题 ECDSA host key 和IP地址对应的key不同的解决
最近在做hadoop,因为要求各主机之间的用户必须相同,且为方便远程登录,需配置无密码登录 先附上ssh无密码登录设置方法: 先生成密钥并配置无ssh无密码登录本机,输入命令: ssh-keygen ...
- java 垃圾回收总结(可达性分析 引用分类
java 垃圾回收总结(1) 以前看过很多次关于垃圾回收相关的文章,都只是看过就忘记了,没有好好的整理一下,发现写文章可以强化自己的记忆. java与C,c++有很大的不同就是java语言开发者不 ...