深度探索c++对象模型 第二章】的更多相关文章

1,c++转换函数:显示转换和隐式转换. 隐式转换为程序员提供了很大的变量.比如整形提升,普通类型转换为类类型(operator int())都为程序带来无尽的方便.试想,如果没有整形提升,一个short类型要加上一个int类型.需要手动转换类型才能运算. 但是隐式转换也会遇到问题.当程序出现问题,如果是隐式转换引起的,也很难排查到.所以在程序设计的时候,一定要考虑的非常仔细. 2,类中如果没有声明构造函数,编译器会给类声明一个默认构造函数.为什么要这么做? 原因是:编译器对所有的类的构造都要调…
1,声明与定义. //声明式如下: extern int x;   //对象式(变量式)声明 std::size_t numDigits(int number);  //函数式声明 class Widget;    //类声明 template<typename T>    //模板类声明 class GraphNode; //定义式如下: int x;    //对象的定义 std::size_t numDigits(int number)    //函数的定义 { ... } class…
这章介绍了搭建Android开发环境的的搭建,主要是在Linux上搭建Android开发环境总体来说因为都是在Linux下开发的,so,只介绍了在Linux环境下的搭建在搭建过程中全是命令操作,和Windows下的操作不一样,所以我的结论是可以吧不同操作系统理解为其有自己的操作特色,不乱抓,话有说回来,我们用的Linux操作系统还是继Windows之后的,为了迎合大众,还是有点联系的,毕竟是开源大众的 首先安装jdk,jdk是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的ja…
前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++.操作系统.计算机网络.算法和数据结构等.C++就先从这本<深度探索C++对象模型>开始.不同于<Effective C++>,这本书主要着眼于C++实现的底层机制,因此我在写这个系列时默认读者已经熟悉C++的基本语法(包括类.继承.多态.泛型等等),将更多地介绍C++具体是如何实现这些语法的.这次我就先写第一.二章,之后每读两章都会更新该系列.如果你有什么问题,欢迎在博客的评论版块和我探讨,…
<深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书.本文志在填坑. 3章3节 Data Member的存取 背景介绍 本节篇幅较短核心内容讲的就是,如下代码的存取效率问题: Point3d origin, *pt = &origin; origin.x = 0.0; pt->x = 0.0; 效率是否有差别.这需要区分x的不同情况.在x是静态成…
<深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书.本文志在填坑. 3章2节 Data Member的布局 背景介绍 访问区(access section)即是指private.public.protected下面的代码区域.当然在类中同一种访问区可以多次声明,视作多个访问区,如: class Point3d { public: // ... private…
深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C++第一套编译器cfront的设计者所写. 了解C++对象模型, 有助于在语言本身以及面向对象观念两方面层次提升. explicit(明确出现于C++程序代码). implicit(隐藏于程序代码背后). 关于对象 每个非内联(non-inline)成员函数只会诞生一个函数实例. 而内联函数会在每个使…
百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 作者:(美)Lippman 目录 本立道生(侯捷译序) 目录 前言 第0章导读(译者的话) 第1章关于对象 加上封装后的布局成本 1.1 C++对象模式 简单对象模型 表格驱动对象模型 C++对象模型 对象模型如何影响程序 1.2关键词所带来的差异 关键词的困扰 策略性正确的struct 1.3对象的差异 …
<深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也是非常有帮助的: 对于需要深入C/C++语言.更好的掌握该语言,<深度探索c++对象模型>这本书一定是必读之一,另外还有如<Effective STL>.<Effective C++>.<More Effective C++>.<STL源码分析>.&…
最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下: 例如,把单一元素的数组放在一个struct的尾端,于是每个struct objects可以拥有可变大小的数组.    code: struct mumble { //stuff char pc[1];    };        //从档案或标准输入装置中取得一个字符串,然后为struct本身和该字符串配置…
最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下: 例如,把单一元素的数组放在一个struct的尾端,于是每个struct objects可以拥有可变大小的数组.    code: struct mumble { //stuff char pc[1];    };        //从档案或标准输入装置中取得一个字符串,然后为struct本身和该字符串配置…
2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio之类的工具的话,写C++代码感觉要比较费劲,最近重读了这本书后,感觉要写点东西下来(因为懒得用笔作笔记,太慢了-_-!)加深下印象. 以前还是新手的时候,总是认为: 1.class如果没有定义任何constructor的话,编译器会自动合成一个default constructor(我习惯叫缺省的构造函数)出…
转载:http://dsqiu.iteye.com/blog/1669614 第一章 关于对象 使用class封装之后的布局成本: class并没有增加成本,data members直接内含在每一个class object之中,就像C struct一样.而member functions虽然被包含在class的声明之内,但是不出现在Object之中.每一个non-inline function 只会产生一个函数实体.至于inline function则会在每一个调用使用的地方产生一个函数实体(在…
C++对象模型: 多重继承模型示意: 第二章:构造函数 语意学 基类和派生类: Bear yogi; ZooAnimal franny=yogi; 在这里,很容易理解合成的copy构造函数将vptr指向基类的虚函数表,不然不仅造成数据切割(sliced),函数调用也混乱了. 返回值的初始化: 在下述四种情况下必须使用成员初始化列表: 上面的产生临时string效率很低,修改后可以提高: 在构造函数中可以使用成员函数来对数据成员进行初始化: 这是因为(可以在构造函数中使用成员函数的原因): 简单来…
C++ Standard将copy constructor分为trivial 和nontrivial两种:只有nontrivial的实例才会被合成于程序之中.决定一个copy constructor是否是nontrivial的,则是由classs是否具有 bitwise copy semantics,在以下四种情况下:class 不具有bitwise copy semantics,如果一个已经声明的类缺乏copy constructor ,编译器为了正确处理“以一个 class object 作…
C++新手一般由两个常见的误解: 如果任何class没有定义默认构造函数(default constructor),编译器就会合成一个来. 编译器合成的的default constructor会显示的设定“class内每一个data member的默认值” 一.编译器在哪种情况下才会合成默认构造函数: 对于未声明构造函数的类,只有在以下四种情况下编译器才会为它们合成默认构造函数: 类的成员有一个类对象(Member Class Object),且该成员含有默认构造函数(default Const…
默认构造函数的构建操作 默认构造函数在需要的时候被编译器合成出来.这里"在需要的时候"指的是编译器需要的时候. 带有默认构造函数的成员对象 如果一个类没有任何构造函数,但是它包含一个成员对象,该成员对象拥有默认构造函数,那么这个类的隐式默认构造函数就是非平凡的,编译器需要为该类合成默认构造函数.为了避免合成出多个默认构造函数,编译器会把合成的默认构造函数.拷贝构造函数.析构函数和赋值拷贝操作符都以内联的方式完成.一个内联含有具有静态链接,不会被文件以外者看到.如果函数不适合做成内联,就…
当我们需要设置class member的初值时,要么是经过member initialization list ,要么在construcotr内. 一.先讨论必须使用member initialization list的四种情况: 在以下四种情况,为了能够让程序被顺利编译,必须使用member initialization list: 当初始化一个reference mmember时 当初始化一个const member时 当调用一个base class的constructor时,并且基类有一组…
一.C和C++对比: C语言的Point3d: 数据成员定义在结构体之内,存在一组各个以功能为导向的函数中,共同处理外部的数据. typedef struct point3d { float x; float y; float z; }Point3d; Point3d可能采用独立的“抽象数据类型”(abstract data type)来实现: class Point3d { public: Point3d(float x = 0.0,float y = 0.0,float z = 0.0) :…
一.三种程序设计范式: C++程序设计模型支持三种程序设计范式(programming paradiams). 程序模型(procedural model) char boy[] = "ccpang"; char *p_son; p_son = ]; strcpy(p_son,boy); if(!strcmp(p_son,boy)) take_to_disneyland(boy); 抽象数据模型(abstract data type model) 此模型的抽象是和一组表达式(publi…
C++有三种类型的成员函数:1.static/nonstatic/virtual 一.成员的各种调用方式 C with Classes 只支持非静态成员函数(Nonstatic Member Functions). 20世纪80年代中期,又引入了virtual functions,但有一种常见的观点是virtual 函数只不过是一种跛脚的函数指针,没有什么用: 1987年,static member functions最后被引入. 1.1 非静态成员函数 设计准则之一就是非静态成员函数必须与一般…
如下三个类: class X { }: class Y :public virtual X { }; class Z : public virtual X {}; class A :public Y,public Z {}; 一.编译器优化之前的大小: 上述四个类在优化之前的大小分别是:1.8.8 .12 类X明明没有任何成员为什么大小是1byte呢?因为那是编译器插入的一个char,这使得这一class的两个object在内存中有独一无二的地址. Y和Z的大小都是8,这受到了机器和编译器共同的…
C++对象模式 非静态数据成员放置在每个类对象内,静态数据成员则被放置在所有类对象之外.静态和非静态的成员函数也被放置在所有类对象之外.每个类产生一堆指向虚函数的指针,放在虚表(vtbl)中.每个类对象维护一个指针(vptr),指向相关的虚表.虚表的首元素维护了每个类所关联的type_info对象. 优点:空间与存取时间效率高 缺点:一旦所用到的类对象的非静态数据成员有所修改,那么代码就要重新编译 加上继承 C++支持单一继承.多重继承和虚拟继承.在虚拟继承的情况下,基类不管在继承链中被派生多少…
C++有三种类型的成员函数:static/nonstatic/virtual 一.成员的各种调用方式 C with class 只支持非静态成员函数(Nonstatic member function),20世纪80年代中期,又引入了virtual function,但是有一种常见的观点是:virtual function只不过是一个跛脚的指针,没有什么用.1980年,static member function最后被引入. 1.1 非静态成员函数 设计准则之一就是非静态成员函数必须具有与一般非…
Template 模板是在编译时期而非执行时期被计算的.因此其不会带来效率的降低. 1: const Point<float> &ref = 0; 该语句会实例化一个Point的float实例.该语句会被扩展为: 1: Point<float> temp(float(0)); 2: const Point<float> &ref = temp; 这是因为0需要转换为对象,才能被引用.如果不能转换,该定义就是错误的.会在编译时被发现. 即一个class o…
在函数中,编译器会帮助将析构函数(Destructor) 安插在相应的位置.对于函数中的局部对象,会将析构函数安插在对象的每一个离开点. 例如: 1: void Function(int a) { 2: Object obj; 3: swithch(a) { 4: case 0 :....;return; 5: case 1 : ....;return; 6: case 2 : ....;return; 7: default : ....;return; 8: } 9: } 在上面的函数中,在s…
————如果不是为了努力维护与C之间的兼容性,C++远比现在简单的多. 如果一个程序员渴望学习C++,但是他却发现书中没有熟悉的struct,一定会苦恼,将这个主题包含到C++里,可以提供语言转移时的救生素,呵呵~多哲学!…
在c++中,有2种class data member:static和nostatic,以及3钟class member function:static,nostatic和virtual.已知下面这个class Point声明: class Point { public: Point(float xval); virtual ~Point(); float x() const; static int PointCount(); protected: virtual ostream& print(o…
前 言 Stanley B.Lippman1.   任何对象模型都需要的三种转换风味: ü        与编译器息息相关的转换 ü        语言语义转换 ü        程序代码和对象模型的转换 2.   C++对象模型的两种解释 ü        语言中直接支持面向对象程序设计的部分 ü        对于各种支持的底层实现机制 3.   C++ class的完整virtual functions在编译时期就固定下来了,程序员没有办法在执行期动态增加或取代其中某一个.这使得虚拟函数调…
第三章:Data语意学 这一章主要讲了类中的数据在内存中是如何分配的,包括(多重)继承和多态. 让我们首先从一段代码开始: class X{}; class Y :virtual public X{}; class Z :virtual public X{}; class A :public Y, public Z{}; std::cout << sizeof(X) << std::endl; std::cout << sizeof(Y) << std::e…