Data Member的绑定

extern float x;  

class Point3d
{
public:
point3d();
//问题:被传回和被设定的x是哪一个x呢?
float X() const
{
return x;
} private:
float x, y, z;//Point3d::X()将返回内部的x。
};

在早期(2.0之前)C++的编译器上,将会指向global x object, 导致C++的两种防御性程序设计风格:    
            1、把所有的data members放在class 声明起头处,以确保正确的绑定
            2、把所有的inline functions, 不管大小都放在class声明之外

对于 member function的argument list并不为真(同以上情况相反)。

-----------------------------------------------------------------

对于下面两个代码,第一个错误的,第二个是正确的

typedef int length;  

 class Point3d
{
public:
//length 将被决议为global
//_val将被决议为Point3d::_val
void mumbel(length val)
{
_val = val;
} length mumble()
{
return _val;
} private:
//导致 _val = val; return _val;不合法
typedef float length;
length _val;
};
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef int length; class base
{ public:
//length 将被决议为global
//_val将被决议为Point3d::_val
void mumbel(length val)
{
_val = val;
} length mumble()
{
return _val;
}
private:
//导致 _val = val; return _val;不合法
typedef float length;
length _val; };
int main(){
base ptr;
ptr.mumbel();
cout<<ptr.mumble()<<endl;; return ;
}

预防性程序风格:请始终把“nested type 声明”放在class的起始处。

对于上述的几种情况解释为:

在早期的编译器中,如果发现有全局变量和class内部的变量冲突的时候,在程序走到类声明里面发现内联函数的时候,会将内联函数里面的值设定为全局变量的值,但是这样就违背了我们的基本操作:为此早期的c++做了两种预防措施

(1):将data的声明放在class的启示位置,隐藏了全局变量

(2)将内联函数放在class声明外面

后来c++ stanred开始做了编译的改变:在编译到class声明里面的时候,如果发现了内联函数,那么不会做评估求值,直到class声明结束以后,才会做求值,其实这多少有点和早期的第二种预防措施类似,但是这仍然有一个弊端,就是这不能保证参数的类型评估求值也发生在声明结束,就相当于上述的两个tyoedef和内嵌的类型定义,这种解释评估发生了第一次遇见,所以我们此时能做的预防措施就是讲内置类型放在class声明的开头,隐藏外部的typedef

 Data Member的布局

c++ data语意学的更多相关文章

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

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

  2. data语意学

    引例: class X{}; class Y:public virtual X{}; class Z:public virtual X{}; class A:public Y,public Z{}; ...

  3. 《深度探索C++对象模型》笔记——Data语意学

    Data Member的绑定 inline member functin躯体之内的一个data member绑定操作会在整个class声明完成之后才发生. argument list中的名称还是会在它 ...

  4. 第3章 Data语意学

    在C++中经常会遇到一个类的大小问题,关于一个类的大小一般受到三个方面的影响. 语言本身所造成的额外负担,如在虚拟继承中会遇到如派生类中会包含一个指针指向base class subobjec,这样会 ...

  5. 【C++】深度探索C++对象模型读书笔记--Data语意学(The Semantics of data)

    1. 一个空类的大小是1 byte.这是为了让这一类的两个对象得以在内存中配置独一无二的地址. 2. Nonstatic data member 放置的是“个别的class object”感兴趣的数据 ...

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

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

  7. inside the C++ Object model总结

    一. 关于对象 1.内联函数:能够除去函数调用的开支,每一处内联函数的调用都是代码的复制.这是一种空间换取时间的做法,若函数代码量大或者有循环的情况下,不宜内联(这件事有些编译器会自动帮你做).在类中 ...

  8. 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

    转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个c ...

  9. 《深度探索C++对象模型》1

    C++对象模型: 多重继承模型示意: 第二章:构造函数 语意学 基类和派生类: Bear yogi; ZooAnimal franny=yogi; 在这里,很容易理解合成的copy构造函数将vptr指 ...

随机推荐

  1. jquery ui sortable 实现table,row的拖动。(Make Table Rows Sortable Using jQuery UI Sortable)

    // Return a helper with preserved width of cells var fixHelper = function(e, ui) { //console.log(ui) ...

  2. 浅析js模板引擎

    js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...

  3. js事件冒泡和捕捉

    (1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div ...

  4. php 实现简易模板引擎

    1.MVC简介 MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式(详情自己百度): 1. Model(模型)表示应用程序核心 ...

  5. Quartz任务调度器及与Spring的整合使用

    参考  点击打开链接

  6. iosiOSlabel基本使用以及文字自适应

    (如果需要的不是使用的属性值如换行形式,可以把对应的属性在程序中书写然后按"command"+鼠标左键点击就可以查看所有属性值) 一label基本设置 self.view.back ...

  7. VBS控制鼠标移动和点击(附源代码下载)

    森思:想用vbs来控制鼠标的移动和点击,虽然按键精灵可以做到,但做这么简单的事情不想启动那么大一个程序,所以自己用VC写了一个小程序,可以让VBS来控制鼠标移动和点击. 用法: 移动鼠标到桌面坐标20 ...

  8. jni开发中的常见错误

    * java.lang.UnsatisfiedLinkError: Native method not found: 本地方法没有找到 * 本地函数名写错 * 忘记加载.so文件 没有调用System ...

  9. 当@PathVariable遇上中文和点

    当@PathVariable遇上中文和点 Spring MVC从3.0开始支持REST,而主要就是通过@PathVariable来处理请求参数和路径的映射.  由于考虑到SEO的缘故,很多人喜欢把新闻 ...

  10. 使用bind实现主从DNS服务器数据同步

    一.bind简介 Linux中通常使用bind来实现DNS服务器的架设,bind软件由isc(www.isc.org)维护.在yum仓库中可以找到软件,配置好yum源,直接使用命令yum instal ...