随笔分类 - 【C++】
摘要:1、相关 在STL中,list是一个双向带环链表。list不能像vector那样使用普通指针作为迭代器,因为其节点在存储空间中不一定连续存在,list的迭代器必须有能力指向list的节点,这样才能正确的递增(指向下一个节点)、递减(指向上一个节点)、取值成员(取节点的数据值)存取等操作,由于STL
阅读全文
摘要:1、相关 前面五个章节都是容器实现的一些基础工作,尤其是迭代器和空间配置器。这两个是实现容器最基础的,一个用来给容器分配空间,一个提供接口以便算法访问容器中的元素。 vector是动态数组,随着元素的加入内部会自动扩充空间容纳新元素,这也是vector实现的难点。vector是一个连续的线性空间,不
阅读全文
摘要:1、Template是STL的基础。 2、当定义一个指针指向特定的实例时,程序中并没有发生什么,因为指针不是对象,编译器不需要知道该类的任何成员数据或对象的分布。现在编译器已经禁止声明一个指向某个模板类的指针。 3、然而当定义一个引用时,会实例化一个模板类的实例,0也会被转化为类型的一个对象(引用不
阅读全文
摘要:1、C++是一个不太容易从程序源码上看出表达式的复杂程度。其中会有很多的临时生成物。 2、一般而言,最好把对象尽可能放在使用它的那个程序区段附近,这么做可以节省非必要的对象产生操作和摧毁操作。如果一个区段的函数有一个以上的离开点,析构函数会被放在每一个离开点。 3、对全局对象而言,C++一定会在ma
阅读全文
摘要:1、虽然一个类的析构函数是虚函数,但是其调用操作员静态的决议出来的。 2、构造函数的函数本体必须条件式的测试传进来的参数,然后决定调用或不调用相关的虚基类构造函数。由最底层的派生类进行虚基类的构造函数的调用,这种机制会压制中间层级类中构造函数对虚基类构造函数的调用。(菱形继承,最底层的派生类会调用最
阅读全文
摘要:1、拥有纯虚函数的基类不可能有实例对象。 2、一般来说,类的数据成员应该被初始化,并且只在构造函数中或类的其他成员函数中指定初值,其他操作都将破坏封装特性。 3、C++中,纯虚函数是可以定义和调用的,但是只能被静态的调用,不能经过虚拟机制来调用。 4、不要将虚析构函数定义为纯虚函数,定义为虚函数比较
阅读全文
摘要:1、虚拟继承中的虚函数机制过于复杂,只建议不要在一个虚基类中定义一个非静态数据成员。 2、对于成员函数的一个测试,测试函数的效能可以得到两个结果:1)inline函数有明显的提升,消除了额外的时间负担,优化版本的inline函数效率更高。2)每多一层继承虚函数执行的时间就有明显的增加,增加继承深度就
阅读全文
摘要:1、相关 前面实现的四部分其实都是为这一章做准备。首先我们来看,STL一共有六大组件:容器、算法、迭代器、仿函数、配接器、配置器。前面迭代器的实现其实只是定义了一些标准,不是真正的迭代器实现,真正的迭代器实现会放在每一个容器里,而容器的实现需要一个基本的功能就是内存分配。这一部分就来实现空间配置器a
阅读全文
摘要:1、多态对象有某种形式执行期类型判断法,多态其实就是使用一个基类指针寻址出一个派生类对象的意思。 2、识别一个class是否支持多态,唯一的方法就是看它是否有任何虚函数。 1)编译期,找到虚函数表,每个类对象被安插一个由编译器内部产生的指针,指向这个表格。每一个虚函数被指派一个表格索引值。 2)执行
阅读全文
摘要:1、静态成员函数不可能做到下面两点:1)直接存取非静态成员变量(静态成员函数只属于类本身,随着类的加载而存在,不属于任何对象,是独立存在的,非静态成员当且仅当实例化对象之后才存在,静态成员函数产生在前,非静态成员函数产生在后,故不能访问,内部访问静态成员用::,而访问非静态成员要用this指针,静态
阅读全文
摘要:1、如果打开优化开关,封装就不会带来执行期的效率成本。 2、如下代码: 每一个Point3d 类对象含有三个坐标值,依次序为x,y,z以及一个vptr,static变量会被放在类对象之外。不同的编译器的区别是vptr有可能放在对象的头或者尾。 在这里实际测试和书上有点差异,取一个类的成员变量的地址的
阅读全文
摘要:1、在C++中一个派生类对象所表现出来的东西其实是自己的成员加上基类的成员的总和,至于派生类成员和基类成员的排列顺序,并不强制指定,大部分编译器基类成员先出现(虚基类除外)。 2、下面讨论四种情况:“单一继承且不含虚函数”,“单一集成并且含有虚函数”,“多重继承”,“虚拟继承”四种情况。 (1)只要
阅读全文
摘要:1、相关 iterator.h文件其实并不涉及具体的哪一个容器的迭代器,只是定义了一些统一的标准,比如迭代器相应的型别,比如一个算法需要用到迭代器所指对象的型别,而怎么获得型别在前面traits编程已经说过。根据经验,最常用到的迭代器的型别有五种,value type,difference type
阅读全文
摘要:1、虚函数继承,派生类赋值给基类 2、分析 首先,创建一个对象则会调用构造函数,创建一个派生类对象时,会先调用基类的构造函数,然后调用派生类自己的构造函数,析构的时候顺序相反。可以将一个派生类对象赋值给基类指针,但是这样会对派生类作出裁剪。也就是上面的base_ptr指向的对象里面没有派生类里独有的
阅读全文
摘要:1、Nonstatic data member在类对象中的排列顺序和声明顺序一样,任何中间介入的static data member都不会被放进对象布局中。 2、同一个access section(也就是private、public、protected区段中),member的排列只需要符合较晚出现的
阅读全文
摘要:1、一个空的class,sizeof的大小是1,这是因为编译器为每一个空类安插一个char,使得这一个class的两个对象得以在内存中配置是独一无二的。 2、class的大小和以下三个因素有关: 1)语言本身所造成的额外负担。当语言支持虚基类时,会导致一些额外负担,在派生类中,这个额外的负担反应在某
阅读全文
摘要:1、相关 copy函数在前面内存基本处理工具中使用过,STL中的copy函数是十分复杂的,复制操作不外乎是运用赋值操作或者拷贝构造函数,copy所用的是前面的,有时候传入copy函数的元素型别是trivial assignemnt operator,因此如果能够直接使用内存直接复制行为(memove
阅读全文
摘要:1、在严谨的C++用词中,定义是指占用内存的行为。 2、显示初始化 如上的定义,每一个都明显以x0初始化其对象。那么必要的程序转换有两个阶段,1)重写每一个定义,其中的初始化操作会被剥除。2)类的拷贝构造调用操作被安插进去。这样上面的代码可能会变成下面这样: 上面的x1.X::X(x0)就表现出对拷
阅读全文
摘要:1、C++编译器会做很多你不知道的事,比如构造函数的隐式转换,但是可以添加explic关键字用来制止单一参数的构造函数被当作一个转换运算符。 2、当编译器需要一个默认构造函数的时候,被合成出来的构造函数只执行编译器所需的行动。下面四种情况,必须为class合成一个构造函数。 1)当一个class没有
阅读全文
摘要:1、相关 很多时候我们需要根据类型的不同来调用不同的函数,在析构和构造工具的实现中,destroy函数有两个版本,第二个版本的实现用到了value_type(first)来获取迭代器的类型,在内存处理工具中,也有很多地方用到这种方式来获得一些模板的类型。其实找到相对应的源码,会发现其实他们是通过模板
阅读全文

浙公网安备 33010602011771号