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 ...
随机推荐
- Linux软件安装管理 - CentOS (二)
1. 软件包管理简介 2. rpm命令管理(Redhat Package Manager) 3. yum在线安装 3.1 yum源文件 vi /etc/yum.repos.d/CentOS-Base. ...
- 2-Bom
前言 window对象是BOM的顶层(核心)对象,所有对象都是通过它延伸出来的,也可以称为window的子对象.由于window是顶层对象,因此调用它的子对象时可以不显示的指明window对象 例如下 ...
- Dojo的UI框架bootstrap for dojo和Dojo-Bootstrap简介
最近在学习Dojo,但样式问题真是头疼呀,虽然清新的淡蓝色很是减缓眼睛的疲劳,但这个扁平化简约风盛行的年代,光是清新的拟物已经满足不了群众的需求了,所以就在这样的需求下,我知道了bootstrap f ...
- Nginx redirect
if ($host != 'www.xxxxx.com' ) { rewrite ^/(.*)$ http://www.xxxx.com/$1 permanent; }
- css,js零散知识的整理
在同一个dom上以冒泡和捕获的方式绑定一个事件,如果事件源是该元素,则是先绑定的哪一个就先执行哪一个,事件源是dom的子孙节点,则先执行捕获事件
- c++字体对齐
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除. 2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是 ...
- NIO 入门
新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的.NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的.面向块的 I/O.通过定义包含数据的类,以及通过以块的形式处 ...
- C# .NETWEB开发6大内置对象
ASP.NET 内置对象包括 1.Response 2.Request 3.Server 4.Application 5.Session 6.Cookie 1 Request对象主要是让 ...
- Gradle学习草稿
参考博客:http://www.cnblogs.com/davenkin/p/gradle-learning-1.html Android Plugin DSL Reference http://go ...
- PHP操作Memcache基本函数
Memcache模块提供了于Memcached方便的面向过程及面向对象的接口,Memcached是为了降低动态web应用从数据库加载数据而产生的一种常驻进程缓存产品.Memcache模块同时提供了一个 ...