- 博客(15)
- 资源 (2)
- 收藏
- 关注
原创 第六章 执行期语意学(Runtime Semantics)
想象下简单的式子:if(yy == xx.getValue()) ...//xx 和 yy的定义X xx;Y yy;//Y定义class Y{public: Y(); ~Y(); bool operator ==(const Y&) const; //...};//X定义class X{public: X(); ~X(); operato...
2018-11-30 07:14:31 215
原创 5.5 析构语意学(Semantics of Destruction)
如果class没有定义destructor,那么只有在class内含的member object(或class自己的base class)有拥有destructor时,编译器才会自动合成一个出来。否则,destructor被视为不需要,也就不需要合成(当然更不需要调用)。例如,Point,默认情况下并没有被编译器合成一个destructor——甚至虽然它拥有一个virtual function...
2018-11-30 06:55:08 167
原创 5.4 对象的效能(Object Efficiency)
以下的效率测试中,对象构造和拷贝所需的成本是以Point3d class声明为基础,从简单形式逐渐到复杂形式,包括Plain OI' Data、抽象数据类型(ADT)、单一继承、多重继承、虚拟继承。以下是测试的主角:Point3d lots_of_copies(Point3d a,Point3d b){ Point3d pC = a; pC = b;//(1) b = a; //...
2018-11-28 07:17:21 180
原创 5.3 对象复制语意学(Object Copy Semantics)
当我们设计一个class,并以一个class object赋值给另一个class object时,我们就用到了拷贝复制操作,我们可以选择默认的浅拷贝,也可以自己提供一个explicit copy assignment operator,或者显示的拒绝把一个class object赋值给另一个class object(将copy assignment operator声明为private)。为了...
2018-11-27 07:34:15 204
原创 5.2 继承体系下的对象构造
当我们定义一个object如下:T object;如果T有一个constructor(不论是由user提供还是编译器合成的),它会被调用。Constructor可能内含大量的隐藏码,因为编译器会扩充每一个constructor,扩充视class T的继承体系而定。一般编译器所做的扩充操作大约如下:记录在member initialization list中的data member...
2018-11-26 07:29:40 171
原创 5.1 “无继承”情况下的对象构造
考虑如下的程序片段:Point global; //1Point foobar(){ Point local; //2 Point* head = new Point; //3 *head = local; //stuff delete heap; //4 return local;}上述表现出三种不用的对象产生方式:global对象、local对象和heap对象。...
2018-11-21 07:32:58 183
原创 第五章 构造、析构、拷贝语义学
如下一个abstract base class声明:class Abstract_base{public: virtual ~Abstract_base() = 0; virtual void interface() const = 0; virtual const char* mumble() const {return _mumble;}protected: char*...
2018-11-20 06:45:18 169
原创 4.5 Inline Functions
一般而言,处理一个inline函数,有两个阶段:分析函数定义,以决定函数的“intrinsic inline ability”(本质的inline能力)。如果函数因其复杂度,或因其构建问题,被判断不可成为inline,它会被转为一个static函数,并在“被编译模块”内产生对函数的定义。真正的inline函数扩展操作是在调用那一点上。这会带来参数的求值操作(evaluation)以及临时...
2018-11-16 07:00:13 186
原创 4.4 指向Member Function 的指针
取一个nonstatic data member的地址,得到的结果该是member在class布局中的bytes位置(再加1);它是一个不完整的值,它需要被绑定在某个class object的地址上,才能够被存取。取一个nonstatic data function地址,如果该函数是nonvirtual,得到的结果是它在内存中真正的地址。这值也是不完整的,也需要被绑定某个class objec...
2018-11-15 07:01:10 202
原创 4.3 函数的效能
在如下这组测试中,在不同编译器计算两个3D点,其中用到了一个nonmember friend function,一个member function,以及一个virtual member function,兵器virtual member function分别在单一、虚拟、多重继承三种情况下执行。如下是nonmember function:void cross_product(const Po...
2018-11-13 06:44:04 264
原创 4.2 Virtual Member Functions(虚拟成员函数)
单一继承下的Virtual Functions为了支持virtual function机制,必须首先能够对于多态对象有某种形式的“执行期类型判断法(runtime type resolution)”。如下的调用操作将需要ptr在执行期的某些相关信息,如此一来才能找到并调用z()的适当实例:ptr->z();或许最直接了当但是成本最高的解决方法就是把必要的信息加在ptr身上。在这...
2018-11-09 07:20:32 412
原创 4.1 Member 的各种调用方式
C++支持三种类型的member functions:static、nonstatic和virtual,每一种被调用的方式都是不同的。确定一个类成员函数不是为static:1、它能直接存取nonstatic数据;2、它被声明为const。static member functions不可能做到这两点。Nonstatic Member Functions(非静态成员函数)C++的设计准则之一...
2018-11-06 07:27:20 809
原创 3.6 指向Data Members的指针
指向Data Members的指针有两个用处:第一,可以调查class members的底层布局;第二。可以用来决定class 中的accesss section的顺序。考虑如下的Point3d的声明。其中有一个virtual function,一个static data member,以及三个坐标值:class Point3d{public: virtual Point3d();...
2018-11-02 10:43:24 444
原创 3.5 对象成员的效率(Object Member Efficiency)
以下对于局部变量、局部数组、C struct 和C++ 封装的函数进行测试,下列是两种编译器列出的各种结果:上述所显示的重点在于,如果把优化打开,“封装”就不会带来执行期的效率成本。使用inline存取函数亦然。在下一个测试中,使用单一继承、虚拟继承(单层)和虚拟继承(双层)的测试结果:class Point1d{...}; //维护xclass Point2d: public...
2018-11-01 07:35:18 233
原创 3.4 “继承”与Data Member
在C++继承模型中,一个derived class object 所表现出来的的东西,是其自己的members加上其base classes members的总和。至于derived class members和base classes members排列顺序并没在C++ Standard中强制规定:理论上编译器可以自由安排。在大部分编译器,base classes members在前面,但属于v...
2018-11-01 06:58:24 220
c++并发编程实战(C++11)pdf 高清
2018-12-17
高质量C++/C编程指南
2018-12-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人