
深度探索C++对象模型读书笔记
深度探索C++对象模型读书笔记
CCSUZB
吾生也有涯,而知也无涯
展开
-
4.2 Virtual Member Functions
一般实现模型每个class有一个virtualtable,内含该class之中有作用的的地址,然后每个object有一个vptr,指向所在;下图为Point的内存布局和其。原创 2022-07-23 14:44:21 · 158 阅读 · 0 评论 -
4.1 Member的各种调用方式
不应该带来什么额外负担,因为编译器内部已经将“member函数实例”转换为对等的“nonmember函数实例”,通过"namemanglin",都可以绝对清楚指出来。为什么编译器要这么做?原创 2022-07-17 15:59:15 · 189 阅读 · 0 评论 -
3.2:Data Member的布局 && 3.3:Data member的存取
考虑如下代码:在中排列顺序將和被声明的顺序一样,任何中间介入的都不会放进对象布局之中;存放在中考虑如下代码:每一个只有一个实体,存在在程序的之中,每次程序调用,就会被内部转化为对该唯一的实体直接操作,例如:从指令执行观点来看,这是C++语言中"通过一个指针和通过一个对象来获取member",结论完全相同的唯一一种情况;直接存放在每一个之中,只要程序员在一个中直接处理一个,所谓就会发生表面上看到对于的直接存取,事实上是经由一个(this指针)完成的...原创 2022-06-05 14:38:54 · 150 阅读 · 0 评论 -
3.1 Data Member的绑定
考虑如下代码:extern float x = 6.66;class Point3d {public: float X() {return x;}private: float x, y, z;};Point3d::X() 传回来的是Point3d内部的x; 而在早期的的C++编译器上,该操作会指向global x object!并因此导出早期C++的两种防御性程序设计风格:把所有的 data members放在class的声明起头处,以保证正确的绑定class Po原创 2022-05-22 14:42:05 · 221 阅读 · 0 评论 -
Data语意学
考虑如下代码:class X{};class Y : public virtual X{};class Z : public virtual X{};class A : public Y, public Z{};cout << sizeof(X) << sizeof(Z) << sizeof(Y) << sizeof(A) ;结果为:1 8 8 16;class X{};并不是空的,它有一个隐藏的1byte大小,那是被编译器安插进去的一个ch原创 2022-05-21 11:17:17 · 128 阅读 · 0 评论 -
2.4成员们的初始化队伍
在下列情况下,为了让你的程序能够被顺利编译,你必须使用member initialization list当初始化一个reference member时;当初始化一个const member时;当调用一个base class的constructor,而它拥有一组参数时当调用一个member class的constructor,而它拥有一组参数时;考虑如下代码:class Word { string _name; int _cnt;public: Word() { _name原创 2022-05-02 15:54:48 · 312 阅读 · 0 评论 -
2.3程序转化语意学
显示的初始化操作已知有如下代码:X x0void foo_bar() { X x1(x0); // 定义另了x1,x2,x3 X x2 = x0; X x3 = X(x0);}上述必要的程序转化有两个阶段:重写每一个定义,其中的初始化操作会被剔除class的copy constructor调用操作会被安插进去在明确双阶段转化后,foo_bar()可能看起来像这样:// 伪代码void foo_bar() { X x1; 定义重写,其中的初始化操作会被剔除 X x2;原创 2022-04-30 15:42:27 · 264 阅读 · 0 评论 -
2.2 Copy Constructor 的构造操作
拷贝构造函数会在如下三种情况下调用:以object的内容初始化另一个class object的初值当object被当作参数交给某个函数时当函数传回一个class object时Default Memberwise Initialization如果 class没有提供一个explicit copy constructor又当如何?当class object以相同class的另一个object作为初始值,其内部是以所谓default memberwise initialization手法完成的:原创 2022-03-30 23:11:05 · 199 阅读 · 0 评论 -
2.1 Default Contstructor 构造函数
考虑如下代码:class Foo {public: int val; Foo *extent;}void foo_bar(){ Foo bar; // 要求bar's members都被清0 if(bar.val || bar.pnext){ // ... }}上述代码语义是要求Foo有一个default contructor可以將它的两个members初始化为0。可是编译器却不会为你做这件事情。带有deafault constrcutor的member class ob原创 2022-03-20 11:49:25 · 691 阅读 · 0 评论 -
1.3 对象的差异
C++程序设计支持三种programming paradigms(程序设计范式)程序模型抽象数据模型面向对象模型你C++以下列方法支持多态经由一组隐式的转化操作。例如把一个drived class指针转化为一个指向public base type的指针shape *ps = new circle();经virtual function机制ps->rotate();经由dynamic_cast和typeid运算符if (cicle *pc = dynamic_ca原创 2022-03-01 22:59:04 · 545 阅读 · 0 评论 -
1.2 关键词所带来的差异
关键词的困扰如果struct关键词的使用实现了C的数据抽象观念,而class关键词实现的是C++的ADT观念,那么当然“不一致性”是一种错误的语言用法;就像一个object被矛盾的声明为static和extern:static int foo;extern int foo;策略性正确的structC struct在C++中的一个合理用途,是当你要传递“一个复杂的class object的全部或部分”到某个C函数去时,struct声明可以將数据封装起来,并保证有与C兼容的空间布局。然而这项保证只有原创 2022-02-27 15:34:46 · 469 阅读 · 0 评论 -
1.1 C++对象模式
C++对象模式原创 2022-02-26 16:08:52 · 795 阅读 · 0 评论