Inside the C++ Object Model: The binding of data member

本节提到了typedef的作用域以及解析方式的问题,有以下代码段:

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 typedef int length;
 6
 7 class X {
 8 public:
 9     length getVal() {
10         cout << sizeof(_val) << endl;
11         return _val;
12     };
13     void setVal(length val) {
14         cout << sizeof(val) << sizeof(_val) << endl;
15         _val = val;
16     };
17 private:
18     typedef double length;
19     length _val;
20 };
21
22 int main(int argc, char* argv[]) {
23     X x;
24     x.setVal(3);
25     x.getVal();
26     return 0;
27 }

其输出结果为:48和8.

在setVal函数中,参数部分的length被解析成了全局定义的typedef int length,而函数体中的length被解析成了class X里面定义的typedef double length。

由此得出的结论为,setVal参数部分的变量类型绑定是根据已经出现过的类型定义来做的,而函数体中的变量的类型绑定则是需要等整个class都分析完以后才开始执行绑定的。

顺便,如果将第5行的typedef int length删掉以后,整个程序将会报错。

时间: 2024-09-30 16:39:25

Inside the C++ Object Model: The binding of data member的相关文章

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

转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个class object之中,就像C struct一样.而member functions虽然被包含在class的声明之内,但是不出现在Object之中.每一个non-inline function 只会产生一个函数实体.至于inline function则会在每一个调用使用的地方产生一个函数实体(在

Inside the C++ Object Model | Object Lessons

1. 加了封装后的布局存取成本(Layout Costs for Adding Encapsulation) 虚函数机制:用于支持有效率的执行期绑定 虚基类机制:实现在继承中避免重复继承. 2. The C++ Object Model pointer-to-member:避免了成员类型不同所需空间不同的问题,对象的成员是以 slot 的索引值来寻址 data member table: member function table: virtual table(vtbl):每个对象有一个指针指(

inside the C++ Object model总结

一. 关于对象 1.内联函数:能够除去函数调用的开支,每一处内联函数的调用都是代码的复制.这是一种空间换取时间的做法,若函数代码量大或者有循环的情况下,不宜内联(这件事有些编译器会自动帮你做).在类中若直接将函数实现写在类体内,默认内联.如果函数因其复杂度或构建等问题被判断为不能成为inline函数,它将被转化为一个static函数.如果一个inline函数被调用太多次的话,会产生大量的扩展码,使程序大小暴涨. 2.C++对象模型: 3.组合,而非继承是把C和C++结合的唯一可行方法. 4.C+

Inside The C++ Object Model(三)

============================================================================3-0. 类所占的内存大小受到三个因素的影响:(1)语言本身所造成的额外负担(Virtual base classes):(2)编译器对于特殊情况所提供的优化处理(空基类优化):(3)Alignment的限制(对齐):注:Empty Virtual base class提供一个Virtual interface,没有定义任何数据,某些编译器对此提

Inside The C++ Object Model(二)

============================================================================2-0. 关键字explicit被引入C++,提供给程序员一种方法,使他们能够制止"单一参数的constructor"被当做一个conversion运算符. ============================================================================2-1.Default Co

Inside The C++ Object Model(五)

============================================================================5-0. 一般而言,class 的data member 应该被初始化,并且只在constructor中是在class 的其他member functions 中指定初值.其他任何操作都将破坏封装性质,是class 的维护和修改更加困难. 图片5-0: (1)纯虚拟函数的存在注:编译器不会在扩展derived class 的destructor时

重温《Inside The C++ Object Model》(1) --关于对象

C/C++ 编程风格 //1.C风格(结构化程序设计):数据和函数(操作)没有任何关联性 typedef struct Point3d { float x; float y; float z; } Point3d_t; void Point3d_print(const Point3d_t *pd) { printf("%g, %g, %g\n", pd->x, pd->y, pd->z); } //2.基于对象(Object-Base):提供抽象数据类型(ADT)来支

Inside The C++ Object Model(一)

============================================================================1-1. 关键字struct和class的一点区别:(1)struct内部默认public属性,class内部成员默认private属性:(2)template中只能使用class来抽象类型参数,不能使用struct,template并不打算和C兼容. 1-2. C程序员有时会把单一元素的数组放在一个struct的尾端,于是每个struct ob

Inside The C++ Object Model(四)

============================================================================4-1. Member 的各种调用方式静态成员函数(static member functions,不属于对象,没有this指针)不能直接存取Nonstatic数据:同时不能被声明为const(const用于后置修饰函数时只用于限定成员函数,意味着将被修饰的成员函数的隐式参数--this指针由原来的Class* const变为const Clas