- 博客(25)
- 收藏
- 关注
原创 模板和RTTI
模板和RTTI模板类模板类的含义更像是一个框架,在你没有确定类型参数之前,里面的任何东西都无法访问,即便里面的东西可能与类型参数无关。template<class type>class A{public: enum Status{status_one,status_two}; static int a; type ty;}我们必须这样访问:A<float>::a;A<int>::Status sa;顺比一提,上述数据(如静
2022-03-17 17:24:29
377
原创 执行期类模型
执行期对象的析构如果一个区段(“{}”括起来的区域)或函数内有一个以上的离开点,析构函数必须放在每一个离开点。{ Point point; swtich(int(point.x)){ case -1: //destructor return; case 0: //destructor return; case 1: //
2022-03-17 17:23:59
533
原创 数据成员模型
数据成员模型nonstatic数据成员对于nonstatic成员,这是每个对象分配内存是占用做多的一部分。每个成员都有自己的私有对象。内部编译器可能会把相同段(访问权限)的成员放在一起,C++标准只保证同一访问权限的成员变量中,后声明的变量处在高地址即可。另外,根据对其原则,成员与成员之间很可能并不是连续放置的,中间可能夹杂着许多padding空间。static数据成员static数据是整个类共享的数据,所以他们很可能被放置在数据段中,并不存在对象的内存中。我们不需要通过对象访问静态成员。数
2022-03-17 17:23:28
126
原创 构造、析构、拷贝
构造、析构、拷贝首先,虽说当我们不定义构造函数、析构函数的时候,编译器会帮我们生成一个,但是实际上,编译器只会生成nontrival的构造、析构等函数。在以下情况中为nontrival的虚继承虚函数类成员变量含有构造函数、析构、复制构造、赋值运算继承的类含有构造、析构、复制构造、赋值运算纯虚函数即便类中含有纯虚函数会让类无法创建实例,但假如这样的类中含有数据成员,那么你可能仍然需要定义该类的构造函数。另外,允许你对纯虚函数进行缺省的定义,即定义纯虚函数,但是这样的函数只能通过
2022-03-17 17:21:54
148
原创 成员函数模型
成员函数模型调用方式非静态成员函数的调用不会带来额外负担,因为成员函数实际上被化为非成员函数的形式进行调用。通过更改函数原型,安插一个额外的参数到成员函数中,即this指针,指出那个对象调用了该函数。然后将函数内部的非静态数据成员改成经由this指针来存取。最后将成员函数重新生成一个外部函数。另外,数据成员和成员函数都会经过名称的特殊处理,使之成为独一无二的元素。目的就在于分清基类和派生类的同名对象。虚拟成员函数的调用通过虚函数指针和虚函数表间接调用。派生类会直接继承基类的虚函数指针
2022-03-17 17:21:29
63
原创 构造函数模型
构造函数模型默认构造函数当你没有定义任何构造函数的时候,编译器会为你生成一个默认构造函数。但是,这个构造函数并非是真正被编译器变成一段实体的代码,在普通情况下的,比如:class A1{public: int a; char* ch;};上面这个类没有任何的构造函数,编译器会在需要的时候提供四个函数——默认构造函数,复制构造函数,析构函数和赋值运算符。但实际上,编译器生成的这个implicit的默认构造函数是trivial的,所以他实际上没有被编译器合成出来。当你在栈上创
2022-03-17 17:19:39
268
原创 第二章 进入C++
本章对C++基础知识进行复习,这里只记录我在这基础上额外学习的知识带参数的main()int main(int argc, char** argv){ //Expressions... return 0;}假如一个C++文件有如上的main()函数,在编译过后我们就能通过命令行的方式运行它。一个命令行由以下结构组成命令 参数1 参数2 参数3 参数n…命令指的就是编译过后的exe文件名字,之后向文件内部的main()传递参数。命令行将以上命令整理成一个字符串数组,也就是字符.
2022-03-06 20:24:49
304
原创 第三章 简单变量
字符假如我们想让char字符存储一些其他字符,比如希腊,中文,日文等,还好c++也提供了一些解决方案unicode提供了一种表示各种字符集的解决方案,C++也同样使用unicode来增加他所能表示的字符范围c++使用wchar_t来存储unicode字符,在设置初始化的时候值前需要加L,比如wchar_t k\u00F6rper = L'中';这里面的变量名也许很奇怪,之后我们解释。L指出接下来的值十宽位字符,有多宽呢?通过sizeof k\u00F6rper 我们得到它长2字节。对于特殊字
2022-03-06 20:24:03
258
原创 第四章 复合类型
数组也许您在工程中根本不会这么做,但您也要知道。数组的列表初始化禁止缩窄转换比如说:long plifs[]={25,98,3.0}; //not allowedchar slifs[4] {'h','i',1122011,'/0'}; //not allowed第一行中,3.0转换为long型是由浮点数转化为整型,是缩窄转换。第二行1122011转化为char类型,由于其数值远大于char所能表示的,所以同样是缩窄转换。字符串long str="s";字符串常量处了表示了其字符换内容外
2022-03-06 20:23:38
354
原创 全面理解网络流中的最大流问题
网络流(最大流问题)前序在将网络里实现算法之前,我们得聊聊网络流究竟是个什么东西,毕竟只有知道它的样貌,才能继续看懂下面的定义,对吧?首先,网络流不仅仅指的是什么FF算法、dinic算法。算法只是用来解决问题的(稍后我们会更加能体会这一点),而网络流,指的就是这一系列存在图论中的,关于“流(Flow)”的问题。参考:Network flow problem - Wikipedia网络流中有以下几种问题:最大流问题最小费用流问题多商品流问题(multi-commodity flow p
2022-03-05 17:39:28
9278
7
原创 第五章 循环和关系表达式
循环文本输入使用cin获得缓冲区的输入数据,如果是文件输入,我们可以利用更加便利的技术——EOF。cin和操作系统协同工作,通过EOF判断输入是否已经结束。但是在windows系统中,键盘也可以模拟EOF。在用户输入字符后,通过**CTRL+Z+**模拟EOF。检测到EOF后,cin会将两个eofbit和failbit都置1,通过eofbit(),failbit()能够获取位的状态。当eofbit置1后,cin将不允许读入,即便你再次调用它。这是合理的,因为EOF代表着文件尾部,程序不应该读取超过文
2022-03-02 22:35:05
56
原创 第八章 函数重载&模板&引用
引用引用最大的用处在函数参数中声明变量,使之称为引用传值函数。当你既想使用引用参数,但却又不希望函数修改引用参数。你可以使用常量引用duble refcube(const double &ra){} //你或许应该使用形参当数据比较大时,比如结构或类,传入引用更好。因为大数据进行复制传参需要的时间很多,使用常量引用会更好。在大型程序中,引用相比指针更直观也更方便书写返回值作为引用由于教科书中常常出现,所以说明一下。引用作为返回值大概率用处只是返回计算值赋值给其他变
2022-03-02 22:34:34
163
原创 第九章 作用域&链接&名称空间
链接性自动局部变量无链接性,生存周期根据函数和括号决定。全局变量是外部链接性,但是如果一个文件定义了该变量,其他文件想要引入该变量必须使用extern关键字声明该变量。静态全局变量是内部链接性,只有文件内部可见,其他外部文件不可访问,但可以重新定义自己的同名变量。静态局部变量无链接性,作用域属于代码块,只有定义的函数可访问,其他函数不可见,同时生存周期是整个程序。mutablemutable关键之指出,即便结构或类创建常量实例,其用mutable修饰的成员依旧可以被修改。struct da
2022-03-02 22:33:19
58
原创 第十章 类
类作用域在类中声明的变量和函数只在类中可见,所以在类外定义成员函数的时候需要类名的解析符。在类外调用函数需要实例化变量的成员运算符,也是类作用域的体现。另一方面,在类内声明常量并直接赋值的形式是行不通的:class Bakery{ private: const int Months = 12; //Fails .....}因为类只是声明类内的形式,它还没有创建任何实例,内存中没有任何关于这个类的数据。对此,有两种解决办法。使用枚举:用枚举为整个类提供整型常量,不过真
2022-02-27 14:45:37
96
原创 第十一章 运算符重载&友元&类型转换
运算符重载我们知道运算符重载有两种形式,成员函数重载和友元重载。为什么会有两种形式,什么时候使用这两种形式,下面进行解释。成员重载我们知道运算符调用是由运算符左边的变量调用的total=coding+fixing;total=coding.operator+(fixing);有几点注意,首先返回值尽量返回副本而不是引用,即便那很花时间。参数设置为const。重载后的操作运算符至少有一个是用户自定义类型,不能两个都是内置类型。这是为了编译器防止你篡改自带的运算法则。重载的操作符的
2022-02-27 14:44:59
137
原创 智能指针小解析
智能指针此节粗略了解C++标准库中的智能指针。为什么存在智能指针?智能指针的存在有两个好处,全部都是由于一个原因——它能自动释放自身所指向的内存。首先,程序员不必管理它所定义的每一个指针,内存释放的工作交给了智能指针进行,这让程序员们们偷懒了许多。第二,智能指针是一种资源管理类,他们能够自行掌控自己的内存让程序能够正常的工作。智能指针的种类任何c++的书都会理应提到智能指针,所以你应该对其有着初步的了解,至少你应该知道他们是怎样使用的。智能指针有四种auto_ptr(c++11不使
2022-02-25 23:06:06
339
原创 第十二章 深复制浅复制&静态成员函数&定位new
浅复制和深复制假如类内声明了指针或引用等数据结构,那么在其进行构造新变量的时候就需要额外注意这些数据。浅复制和深复制的诞生原因大部分是因为类地动态内存分配。我们想让类成员在程序运行时决定需要多少分配内存,所以我们定义一个成员指针,在其构造函数是使用new运算符动态分配内存。但请考虑下面的情况。myString stringA(stringB);stringA调用复制构造函数将stringB作为参数传递,如果你没有实现复制构造函数,那么编译器会自动生成一个默认复制构造函数。默认构造函数仅仅只负
2022-02-24 21:51:43
70
原创 第十三章 派生类&虚函数
派生类的构造函数鉴于已经掌握类继承的一些非常基本的知识,比如类继承的用法,含义,定义等。这里将更加深入理解类继承本身,详尽阐述继承的特性和原因。我们知道,派生类的构造函数必须使用基类的构造函数来构造基类,而且只能使用列表初始化的方式去构造基类,这是为什么?事实上,如果我们创建一个派生类的对象,那么计算机会调用派生类的构造函数,但是此时我们还没有真正的构造基类,派生类命名是基类的衍生,是基类的补充,但是我们调用派生类的构造函数并不能真正的构造基类。也就是说,基类的构造函数必须早于派生类的构造函数调用。、
2022-02-24 21:49:41
1154
原创 deque
deque此章节会详细解析deque这一容器,使用VS STL的deque为例子。VS STL在核心部分和SGI STL是一致的,但是在内存分配和一些地方有着很大的不同,我会着重把他讲的清楚明白。首先我们还是要讲讲deque与vector的不同,我们称deque为双端队列,理由是他可以同时在容器的结尾和开头进行O(1)的插入删除操作。正是这一差别导致deque在内部于vector有着很大的不同。vector在扩增的时候时常不停的申请内存复制移动,但是deque却不存在这样的操作。这一行为让deq
2022-02-24 21:47:00
652
原创 list容器
list容器此节大致讲解LIst的底层实现,依旧使用VS STLList容器内部也存在一个```_Mypair```,而不像vector,里面的```_Scary_val```是很长的一段,List的```_Scary_val```很简单。using _Scary_val = _List_val<_Val_types>;让我们进入到```_List_val```里面看看一个List都有什么..._Nodeptr _Myhead;size_type _Mysize;..
2022-02-24 16:04:41
561
原创 第十四章 has-a关系&多重继承&类模板
has-a关系类之间除了有is-a关系,还有has-a关系,它有三种方式实现包含类对象私有继承保护继承包含对象成员的类我们可以在类private字段声明一个类类型,这样两个类之间就是has-a关系,比如Student类中有名为name的string类。这样的包含方式与共有继承不同,它是只继承实现而不继承接口。我们可以利用name对象使用string类的接口函数,但是不能直接在Student类外面使用string的接口。私有继承私有继承也是has-a关系,即通过私有继承string类实现
2022-02-24 13:58:39
271
原创 第十五章 友元类&嵌套类&异常&RTTI&类型转换运算符
友元类和友元函数一样,友元类具有原始类的访问权限,可以访问其私有成员和保护成员。友元类的关系不同于is-a或has-a关系,友元类可以让看起来互无关系的两个类具有关系,比如遥控器和电视机。声明友元类的位置无关紧要,在private或public都可以,但是由于友元类或访问原始类的对象,所以原始类的声明必然在友元类之前,面对更复杂的情况可以使用前置声明。有些时候并不需要整个类都声明为友元,只将部分函数声明问友元成员函数。注意使用域解析符。friend void Remote::set_channel
2022-02-24 13:56:26
81
原创 第十六章 智能指针模板类&STL&函数对象
智能指针模板类人类为了让自己想到更少,所以决定让函数结束的时候分配内存的指针自动释放它所分配的内存。具体实现方法就是将指针定义成类,在被释放的时候调用其析构函数同时释放分配的内存。智能指针有四个模板auto_ptrunique_ptrshared_ptrweak_ptr使用的时候必须包含memory头文件,用法auto_ptr<type-name> ptr(new type-name);由于智能指针模板类使用explicit,所以不允许隐式类型转换,只能使用显式类型转换。
2022-02-24 13:55:02
195
原创 第十八章 移动语义&委托构造函数&虚函数管理&lambda函数&包装器&可变参数模板
移动语义先提出一个问题。现在有一个字符串数组长度有20000个,每个字符串含有100个字符,那么这近20MB的内存空间在进行赋值以及用它复制出一个副本,比如说传参,返回值传递等,每一次这样的操作都会复制开辟20MB的内存空间一个个的复制过去。尤其是在返回值的时候,函数返回一个超大的空间,但是只用临时变量暂时存储,返回结果复制过去之后就里马删掉了,这样的操作看起来是不必要的,假如接受返回值的变量直接指向那块临时变量该多好,这要就不用来回复制这块内存了。移动语义解决了这个问题。要想实现移动语义,就要告
2022-02-24 13:51:41
144
原创 vector
vector容器此节大概讲述一下VS STL的vector容器,对几个函数进行解析以及内部实现进行了解以下。打开vector你会看到vector模板类真正含有的东西只有一个_Compressed_pair<_Alty, _Scary_val> _Mypair_Mypair内部最重要的就是_Scary_val,它是一个别名,具体声明如下。using _Scary_val = _Vector_val< conditional_t&l
2022-02-24 13:47:28
199
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人