文章开始提出了一段示例代码,并讨论了返回哪个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的绑定的更多相关文章

  1. Effective C# 学习笔记(原则一:始终能的使用属性(property),而不是可直接访问的Data Member)

    原则一:始终能的使用属性(property),而不是可直接访问的Data Member    Always use properties instead of accessible data memb ...

  2. C++ Data Member内存布局

    如果一个类只定义了类名,没定义任何方法和字段,如class A{};那么class A的每个实例占用1个字节的内存,编译器会会在这个其实例中安插一个char,以保证每个A实例在内存中有唯一的地址,如A ...

  3. 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 ...

  4. 始终使用属性(Property),而不是字段(Data Member)

    1.始终使用属性(Property),而不是字段(Data Member) C# 属性已经晋升为一等公民,如果你的类中还有public的字段,Stop.访问属性和字段的方式是一样的,但是属性是用方法( ...

  5. Data Member Order

    https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-member-order In some appl ...

  6. WPF使用附加属性绑定,解决data grid列绑定不上的问题

    背景 需要对datagrid的列header添加自定义属性,然后绑定,并根据不同的列header绑定不同的值,传统的加扩展类太麻烦,而附加属性的特点更适用于这种场景. 1.xaml 代码 <Da ...

  7. 《深度探索c++对象模型》chapter3 Data语意学

    一个空的class:如 class X{} ; sizeof(X)==1; sizeof为什么为1,他有一个隐晦的1 byte,那是被编译器安插进去的一个char,这使得class2的两个object ...

  8. Data 语义学(1)

    一.Data Member 的绑定(The binding of Data Member) extern float x; class Point3d { public: Point3d( float ...

  9. c++对象模型之Data布局

    Data语意学 class X{}; class Y : publicvirtual X {}; class Z : publicvirtual X {}; class A : publicY, pu ...

随机推荐

  1. Linux软件安装管理 - CentOS (二)

    1. 软件包管理简介 2. rpm命令管理(Redhat Package Manager) 3. yum在线安装 3.1 yum源文件 vi /etc/yum.repos.d/CentOS-Base. ...

  2. 2-Bom

    前言 window对象是BOM的顶层(核心)对象,所有对象都是通过它延伸出来的,也可以称为window的子对象.由于window是顶层对象,因此调用它的子对象时可以不显示的指明window对象 例如下 ...

  3. Dojo的UI框架bootstrap for dojo和Dojo-Bootstrap简介

    最近在学习Dojo,但样式问题真是头疼呀,虽然清新的淡蓝色很是减缓眼睛的疲劳,但这个扁平化简约风盛行的年代,光是清新的拟物已经满足不了群众的需求了,所以就在这样的需求下,我知道了bootstrap f ...

  4. Nginx redirect

    if ($host != 'www.xxxxx.com' ) { rewrite ^/(.*)$ http://www.xxxx.com/$1 permanent; }

  5. css,js零散知识的整理

    在同一个dom上以冒泡和捕获的方式绑定一个事件,如果事件源是该元素,则是先绑定的哪一个就先执行哪一个,事件源是dom的子孙节点,则先执行捕获事件

  6. c++字体对齐

    字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:    1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除.   2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是 ...

  7. NIO 入门

    新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的.NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的.面向块的 I/O.通过定义包含数据的类,以及通过以块的形式处 ...

  8. C# .NETWEB开发6大内置对象

    ASP.NET 内置对象包括 1.Response 2.Request  3.Server  4.Application   5.Session   6.Cookie 1  Request对象主要是让 ...

  9. Gradle学习草稿

    参考博客:http://www.cnblogs.com/davenkin/p/gradle-learning-1.html Android Plugin DSL Reference http://go ...

  10. PHP操作Memcache基本函数

    Memcache模块提供了于Memcached方便的面向过程及面向对象的接口,Memcached是为了降低动态web应用从数据库加载数据而产生的一种常驻进程缓存产品.Memcache模块同时提供了一个 ...