Inside The C++ Object Model(四)

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

数目各种调用方式

(1)Nonstatic Member Functions(非静态成员函数)

名称的特殊处理
编译器会把参数和函数名称编码在一起(函数特征标:函数名称+参数数目+参数类型),但是如果“返回类型”声明错误,就没办法检查出来。

(2)Virtual Member Functions(虚拟成员函数)

注:“经由一个class object调用一个Virtual function”,这种操作应该总是被编译器像对待一般的Nonstatic member function一样地加以决议。所以如下调用操作:
// Point3d obj
obj.normalize();
会被编译器转换为:
// 经由obj调用的函数实体只可以是Point3d::normalize()
normalize_7Point3dFv(&obj);

(3)Static Member Functions(静态成员函数)


图片4-1-6;


图片4-1-7;


图片4-1-8;

============================================================================
4-2. Virtual Member functions(虚拟成员函数)
(1)我们已经知道Virtual function的一般实现模型:每一个class 有一个virtual table,内含该class 之中有作用的Virtual function 地址,然后每个object有一个vptr,指向Virtual table的所在。


图片4-2-1;


图片4-2-2;

(2)多重继承下的Virtual table
图片4-2-3;


图片4-2-4;


注:Sun编译器将多个Virtual tables 连锁为一个:指向次要表格的指针,可由主要表格名称加上一个offset获得(可以获得速度提升)。

(3)虚拟继承下的Virtual Functions


图片4-2-5;


图片4-2-6;
注:不要在一个Virtual base clas 中声明Nonstatic data members,否则,虚基类,虚函数和相关继承导致的各种offset调整所来的复杂性会让你犹如进入迷宫一般。

============================================================================
4-4. 指向 Member Function 的指针
(1)普通Member Function 指针


图片4-4-1;

//member function指针的声明语法:
double (Point::*coord)();
//指定其值
coord = &Point::y;
//调用.origin为Point对象
(origin.*coord)(); // 或 (ptr->*coord)();
// 此操作会被编译器转化为如下形式:
// 虚拟C++码
(coord)(&origin) // (coord)(ptr);

(2)支持“指向Virtual Member Functions”之指针

图片4-4-2;


图片4-4-3;

(3)在多重继承之下


图片4-4-4;

============================================================================
4-5. Inline Functions


图片4-5-1;

(1)形式参数


图片4-5-2;

(2)局部变量


图片4-5-3;


图片4-5-4;


图片4-5-5;


图片4-5-6;


图片4-5-7;

============================================================================

时间: 2024-07-30 10:12:44

Inside The C++ Object Model(四)的相关文章

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(二)

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

《深度探索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(一)

============================================================================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(三)

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

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》(2) --Default-Constructor的建构操作

//constructor/non-constructor的区别 class Foo { public: //Foo():val(0),next(NULL) {} int val; Foo *next; }; void foo_bar() { Foo bar; if ( bar.val && bar.next ) { cout << bar.val << endl; printf("%p\n", bar.next); cout <<

重温《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)来支