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 ...
随机推荐
- jenkins jmeter持续集成批处理jmx脚本
这篇文章介绍jenkis jmeter的持续集成,利用jenkins定时任务去批处理执行jmeter的jmx脚本文件,并且生成测试报告 1:jmeter的安装这里我就不在赘述了,如有问题可参考我的jm ...
- ajax使用json
json是什么什么的废话不说了,去百度吧.我这里介绍一下我为何要使用json.我使用ajax响应返回值时,项目中需求要返回多个值,不能只返回一个值.这时候就想起来用到json了.这可能只是json的一 ...
- 关于ajax的短轮询问题
利用前台的ajax不断向后台服务器请求,后台服务器不断查看数据库里的信息是否变化.若变化将信息返回前台,并执行一些操作 前台ajax代码 注意要加上cache这一项,如果是post请求的化,可以免了. ...
- 初始化git
git config --global user.name "Firstname Lastname" git config --global user.email "yo ...
- Codeforces Round #346 (Div. 2) A Round-House
A. Round House 题目链接http://codeforces.com/contest/659/problem/A Description Vasya lives in a round bu ...
- Hbulider里面template模板自用
template.js 一款 JavaScript 模板引擎,简单,好用.提供一套模板语法,用户可以写一个模板区块,每次根据传入的数据,生成对应数据产生的HTML片段,渲染不同的效果. 特性: 模版编 ...
- 图片验证码自动识别,使用tess4j进行验证码自动识别(java实现)
1.下载tess4j依赖的jar包,maven中央库地址:<dependency> <groupId>net.sourceforge.tess4j< ...
- (十)foreac遍历、break和countinue以及标签和switch循环
foreach语法,表示不必创建int变量去对由访问项构成的序列进行计数,foreach将自动产生每一项. 例:输出数组的所有元素. float f[]=new float[5]; f[0]=1.0f ...
- npm 使用代理
npm install 有时候会安装失败,可能是网络的问题,可以使用代理来安装 npm获取配置有6种方式,优先级由高到底. 命令行参数. --proxy http://server:port即将pro ...
- B-number
B-number 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3652 数位dp 这题是暑期集训的时候做的,昨天补了数位dp的记忆化搜索做法,把艾神的 ...