![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【C++】
文章平均质量分 90
吾之求索
https://github.com/Small-Cube
展开
-
第十章 知识点总结
10.1 概述 标准库定义了一组泛型算法,因为他们实现了一些经典算法的公共接口,如排序和搜索。称它们为泛型的,是因为它们可以用于不同的类型的元素和多种容器类型。10.2 初识泛型算法 10.2.1 只读算法 accumulate(v.begin(),v.end(),0) 该算法接受三个参数,前两个指出需要求和的范围。第三个为和的初值。 ...原创 2018-04-29 10:23:49 · 237 阅读 · 0 评论 -
C++-----虚函数、虚函数指针、虚函数表、通过指针访问类的虚函数成员
1、虚函数继承,派生类赋值给基类#include<vector>#include<iostream>using namespace std;class Base {public: Base() { A(); }; virtual void A() { cout << "Base::A" << endl; } void B()...原创 2019-05-22 18:44:37 · 907 阅读 · 3 评论 -
C++-----深度探索对象模型-第二章-构造函数语义学(一)
1、C++编译器会做很多你不知道的事,比如构造函数的隐式转换,但是可以添加explic关键字用来制止单一参数的构造函数被当作一个转换运算符。2、当编译器需要一个默认构造函数的时候,被合成出来的构造函数只执行编译器所需的行动。下面四种情况,必须为class合成一个构造函数。 1)当一个class没有任何构造函数,但是其内部含有一个类对象,且后者有一个默认构造函数,就必须为该类合成一个构...原创 2019-05-19 10:19:31 · 273 阅读 · 0 评论 -
C++-----深度探索对象模型-第三章-Data语意学(四)
1、如果打开优化开关,封装就不会带来执行期的效率成本。2、如下代码:class Point3d{public: virtual ~Point3d(); //...protected: static Point3d origin; float x,y,z;}; 每一个Point3d 类对象含有三个坐标值,依次序为x,y,z以及一个vptr,s...原创 2019-05-27 09:54:33 · 113 阅读 · 0 评论 -
C++-----深度探索C++对象模型-第四章-Function语意学(一)
1、静态成员函数不可能做到下面两点:1)直接存取非静态成员变量(静态成员函数只属于类本身,随着类的加载而存在,不属于任何对象,是独立存在的,非静态成员当且仅当实例化对象之后才存在,静态成员函数产生在前,非静态成员函数产生在后,故不能访问,内部访问静态成员用::,而访问非静态成员要用this指针,静态成员函数没有this指针,故不能访问。)。2)不可能被声明为const(既然不能直接存取费静态成员变...原创 2019-05-27 17:22:08 · 130 阅读 · 0 评论 -
C++-----深度探索C++对象模型-第四章-Function语意学(三)
1、虚拟继承中的虚函数机制过于复杂,只建议不要在一个虚基类中定义一个非静态数据成员。2、对于成员函数的一个测试,测试函数的效能可以得到两个结果:1)inline函数有明显的提升,消除了额外的时间负担,优化版本的inline函数效率更高。2)每多一层继承虚函数执行的时间就有明显的增加,增加继承深度就增加了执行成本。3、对一个非静态数据成员取地址得到的是该成员在类布局中的位置也就是偏移量(再加...原创 2019-05-30 11:12:36 · 152 阅读 · 0 评论 -
C++-----深度探索对象模型-第三章-Data语意学(三)
1、在C++中一个派生类对象所表现出来的东西其实是自己的成员加上基类的成员的总和,至于派生类成员和基类成员的排列顺序,并不强制指定,大部分编译器基类成员先出现(虚基类除外)。2、下面讨论四种情况:“单一继承且不含虚函数”,“单一集成并且含有虚函数”,“多重继承”,“虚拟继承”四种情况。 (1)只要继承不要多态 一般来说,具体继承(相对于虚拟继承)并不会增加空间或存取...原创 2019-05-23 17:21:57 · 149 阅读 · 0 评论 -
C++-----深度探索C++对象模型-第五章-构造、析构、拷贝语意学(一)
1、拥有纯虚函数的基类不可能有实例对象。2、一般来说,类的数据成员应该被初始化,并且只在构造函数中或类的其他成员函数中指定初值,其他操作都将破坏封装特性。3、C++中,纯虚函数是可以定义和调用的,但是只能被静态的调用,不能经过虚拟机制来调用。4、不要将虚析构函数定义为纯虚函数,定义为虚函数比较好。因为在每一个派生类的析构函数都会被编译器加以扩张,以静态调用的方式调用其每一个虚基类以及上...原创 2019-05-31 11:05:24 · 196 阅读 · 0 评论 -
C++-----深度探索C++对象模型-第四章-Function语意学(二)
1、多态对象有某种形式执行期类型判断法,多态其实就是使用一个基类指针寻址出一个派生类对象的意思。2、识别一个class是否支持多态,唯一的方法就是看它是否有任何虚函数。 1)编译期,找到虚函数表,每个类对象被安插一个由编译器内部产生的指针,指向这个表格。每一个虚函数被指派一个表格索引值。 2)执行期,激活虚函数。3、一个类只会有一个虚函数表,每一个表内含其对应的类对象激...原创 2019-05-29 17:30:56 · 239 阅读 · 0 评论 -
C++-----深度探索C++对象模型-第五章-构造、析构、拷贝语意学(二)
1、虽然一个类的析构函数是虚函数,但是其调用操作员静态的决议出来的。2、构造函数的函数本体必须条件式的测试传进来的参数,然后决定调用或不调用相关的虚基类构造函数。由最底层的派生类进行虚基类的构造函数的调用,这种机制会压制中间层级类中构造函数对虚基类构造函数的调用。(菱形继承,最底层的派生类会调用最上层虚基类的构造函数,而在调用中间两个基类构造时,将参数设置为flase,这样中间两个基类的构造函...原创 2019-06-02 16:22:49 · 181 阅读 · 0 评论 -
C++-----深度探索C++对象模型-第六章-执行期语意学
1、C++是一个不太容易从程序源码上看出表达式的复杂程度。其中会有很多的临时生成物。2、一般而言,最好把对象尽可能放在使用它的那个程序区段附近,这么做可以节省非必要的对象产生操作和摧毁操作。如果一个区段的函数有一个以上的离开点,析构函数会被放在每一个离开点。3、对全局对象而言,C++一定会在main函数中第一次调用对象之前把对象构造出来,而在main结束之前把对象摧毁掉。全局对象放在数据段...原创 2019-06-03 10:56:51 · 192 阅读 · 0 评论 -
C++-----深度探索对象模型-第三章-Data语意学(二)
1、Nonstatic data member在类对象中的排列顺序和声明顺序一样,任何中间介入的static data member都不会被放进对象布局中。2、同一个access section(也就是private、public、protected区段中),member的排列只需要符合较晚出现的member在类对象中有更高的地址。(从低到高排列)各个member不一定连续排列。有可能会有东西...原创 2019-05-22 16:24:15 · 140 阅读 · 0 评论 -
C++-----深度探索对象模型-第三章-Data语意学(一)
1、一个空的class,sizeof的大小是1,这是因为编译器为每一个空类安插一个char,使得这一个class的两个对象得以在内存中配置是独一无二的。2、class的大小和以下三个因素有关: 1)语言本身所造成的额外负担。当语言支持虚基类时,会导致一些额外负担,在派生类中,这个额外的负担反应在某个形式的指针上,一般就是虚函数指针,或者是一个徐基类对象。 2)编译器对特殊情...原创 2019-05-21 16:01:39 · 144 阅读 · 0 评论 -
C++-----深度探索对象模型-第一章-关于对象(二)
1、C++兼容C的struct关键字。2、C中struct更偏于数据封装,C++则不仅仅是封装性还包括了继承性。struct的本身带有public,class本身带有private。3、在C++中凡是处于同一个access section的数据必定保证其声明顺序在内存的顺序一致,但是不同的access section中就不一定了。4、在C++中使用struct的建议是:将数据封装起来,...原创 2019-05-15 10:21:34 · 86 阅读 · 0 评论 -
C++ -----备忘录
C++两种类,一种类是带指针的类,一种是不带指针的类。当写一个不带指针的类的时候,拷贝构造函数、拷贝复制函数和析构函数是可以使用默认的。当一个类带有指针之后,拷贝构造函数、拷贝复制函数和析构函数需要自己去写。const char* cstr=0;也相当于 char const * cstr=0;第一点,const在 * 左边,所以是常量指针,即cstr指向的内容是常量,即cstr指向内容无...原创 2019-01-14 17:16:23 · 340 阅读 · 0 评论 -
C++------模板与泛型编程
一、定义模板1、函数模板template<typename T>int compare(const T &v1,const T &v2 ){ if(V1<V2) return -1; if(v1>v2) return 1;} 模板定义以关键字template开始,后跟一个模板参数列表,这是一个逗号分隔的一个或多个模板...原创 2019-05-16 17:26:35 · 292 阅读 · 0 评论 -
C++-----列表 list
列表list 列表的核心是一个双向链表,双向开口,可在头、尾两个方向进行元素的插入和删除,因此list除了提供与vector相同的push_back(),和pop_back(),之外还提供在头部进行数据输入输出的操作函数。push_front()和pop_front()。因为链表内存空间不连续,所以不支持随即操作,既没有at()操作也不支持下标访问,只能从头到尾的顺序操作。 ...原创 2018-12-20 16:48:09 · 32000 阅读 · 2 评论 -
C++-----容器及应用(vector)
向量 vector vector 是STL中最常用的容器,其特点是占用连续内存空间,对数据的随机访问支持的很好,既可以像数组那样被访问元素的下标来访问,也可以使用其提供的成员函数来at()来访问。向量是一个按照尾部开口设计的容器,因此在其尾部进行数据的输入和输出效率最高。向量定义于头文件 vector,命名于名字空间 std。 1. 1 vector 对象的定义和初始化...原创 2018-12-18 20:35:56 · 272 阅读 · 0 评论 -
C++-----STL与泛型编程(1)
此系列博客,图片文字观点均是来自侯捷老师讲义课程,仅作为学习用途。 无意在网上看到侯捷老师的课程,第一眼看见就决定有时间一定要看看。这一部分的东西主要是侯捷老师视频和课件整理而来,让自己对C++和STL有一个比较深入的理解。使用一个东西,却不明白它的道理,这不高明。虽然这句话在别的地方不一定适用,但是对于程序员而言,知其然很重要,知其所以然也很重要。1、命名空...原创 2019-04-19 09:27:34 · 389 阅读 · 0 评论 -
C++-----STL与泛型编程(二)
此系列博客,图片文字观点均是来自侯捷老师讲义课程,仅作为学习用途。1、源代码之分布 源码之前,了无秘密。标准库是指标准接口,但是具体实现可能会有细微不同。 VS2015的目录下include目录下:里面含有标准库的源码。 DEV-C++的源码也是在其目录下的include中。2、面向对象编程OPP和泛型编程GP...原创 2019-04-23 08:23:28 · 164 阅读 · 0 评论 -
C++-----STL与泛型编程(三)
此系列博客,图片文字观点均是来自侯捷老师讲义课程,仅作为学习用途。1、深度探索list GNU C2.9版本实现如下: list的定义如下:可以看到其中的数据只有一个指针,所以sizeof(list)等于4。这是在GNU C2.9版本下的结果。 双向链表的节点定义:可以看到其中有一个数据,有两个指针,一...原创 2019-04-24 16:13:58 · 424 阅读 · 0 评论 -
C++-----深度探索对象模型-第一章-关于对象(一)
1、将C程序转化为C++封装后,成本其实并没有增加,数据成员放在class和struct中是一样的,成员函数虽然也在class中声明,但是并不会出现在对象中。2、C++在布局和存取时间上的主要额外负担是由virtual引起的。包括:虚函数(virtual function)机制,用以支持一个有效率的执行期绑定。虚基类(virtual base class),用来实现多次出现在继承体系中的bas...原创 2019-05-14 09:36:49 · 151 阅读 · 0 评论 -
C++-----深度探索对象模型-第二章-构造函数语义学(二)
1、在严谨的C++用词中,定义是指占用内存的行为。2、显示初始化X x0;void foo(){ X x1(x0); X x2=x0; X x3=X(x0);} 如上的定义,每一个都明显以x0初始化其对象。那么必要的程序转换有两个阶段,1)重写每一个定义,其中的初始化操作会被剥除。2)类的拷贝构造调用操作被安插进去。这样上面的代码可能会变成下面这...原创 2019-05-20 10:56:43 · 160 阅读 · 0 评论 -
C++-----深度探索C++对象模型-第七章-站在对象模型的尖端
1、Template是STL的基础。2、当定义一个指针指向特定的实例时,程序中并没有发生什么,因为指针不是对象,编译器不需要知道该类的任何成员数据或对象的分布。现在编译器已经禁止声明一个指向某个模板类的指针。3、然而当定义一个引用时,会实例化一个模板类的实例,0也会被转化为类型的一个对象(引用不能指向无物),如果不能转换会在编译期报错。4、当实例化一个类时,实例出来的对象空间大小必须能...原创 2019-06-04 11:15:37 · 185 阅读 · 0 评论