06 2021 档案

摘要:一、普通new运算符和delete运算符 1.new运算符和delete运算符实际上都由由两个步骤组成: new运算符: ①分配所需的内存:通过调用适当库的new运算符函数来分配内存(实际上所有new运算符都是由malloc完成,自己重载new时也应该用malloc分配内存,delete都由free 阅读全文
posted @ 2021-06-30 12:35 放不下的小女孩 阅读(159) 评论(0) 推荐(0)
摘要:一、全局变量 全局变量要求在第一次执行前就被准备好,在程序结束时被销毁。因为构造函数在执行期才能实施,所以需要对一个全局对象做静态初始化。如下面代码所示,后三行的对象没法在编译器完成初始化(都是非常量表达式),所以需要静态初始化并且也需要内存静态释放操作(静态意思是看起来像在程序执行前构造或者在程序 阅读全文
posted @ 2021-06-29 12:12 放不下的小女孩 阅读(74) 评论(0) 推荐(0)
摘要:1.如果类没有定义析构函数,那么只有在class内含的成员变量或自己的基类含有析构函数的情况下,才需要析构函数。(此时编译器会自动合成也不会被调用)。 2.编译器扩展析构函数的顺序 ①析构函数的本体被执行 ②如果类拥有含有析构函数的类成员对象,则他们会以声明的相反顺序被调用。 ③如果类含有一个vpt 阅读全文
posted @ 2021-06-29 10:58 放不下的小女孩 阅读(97) 评论(0) 推荐(0)
摘要:一、构造函数 1.虚继承体系下的构造函数 为了满足虚继承只有一个虚基类子对象的条件(即由最顶层的派生类调用虚基类的构造函数来初始化虚基类子对象),编译器在构造函数中加入一个参数bool _most_derived来判断是否是顶层派生类,如果是则调用拷贝构造函数。可能的伪码如下。 Point3d *P 阅读全文
posted @ 2021-06-28 21:49 放不下的小女孩 阅读(132) 评论(0) 推荐(0)
摘要:这一章讲的东西很杂、所以我只归纳并延伸了一下标题提到的东西。比如这篇写一下纯虚函数和聚合类的构造。 一、纯虚函数: 1.含有纯虚函数的类不能有实例,所以一般纯虚函数没有定义。但是纯虚还是是可以加上定义并且也能够被调用的,但是必须满足以下条件(结合了C++Primer的知识点) ①纯虚函数的定义必须在 阅读全文
posted @ 2021-06-28 12:44 放不下的小女孩 阅读(203) 评论(0) 推荐(0)
摘要:1.内联inline是一个请求,编译器一般会评估函数是否值得内联或者能够内联,如果满足内联条件则编译器会对函数进行内联处理。 2.处理一个内联函数一般有两个阶段: (1)分析函数定义以决定函数的本质的内联能力(intrinsic inline ablitity) 函数如果因为其复杂度或构建原因被判断 阅读全文
posted @ 2021-06-24 17:35 放不下的小女孩 阅读(165) 评论(0) 推荐(0)
摘要:1.指向作用域运算符(书里叫成员选择运算符)"::"的指针的作用是保存this指针。所以静态成员函数指针(没有this)的类型是函数指针,而不是成员函数的指针。 2.指向成员函数的指针有两种功能:①调用普通的成员函数②调用虚成员函数 对前者取地址得到的是该函数在内存中的真实地址,而后者取地址得到的是 阅读全文
posted @ 2021-06-24 12:32 放不下的小女孩 阅读(274) 评论(0) 推荐(0)
摘要:一、单继承情况 1.虚函数表、指向虚函数表的指针以及类型信息: ①为了实现多态,我们需要知道一个指针或引用的真实类型以及其所调用函数实例的位置。所以编译器会创建一个虚函数表,里面存放类的类型和类函数的实例地址,并且在类内存中加入一个指向虚函数表的指针vptr。(为什么不放到类中?导致类的内存不固定, 阅读全文
posted @ 2021-06-23 21:36 放不下的小女孩 阅读(767) 评论(0) 推荐(0)
摘要:一、非静态成员函数: 1.改写函数的signature(函数名,函数参数个数,函数参数):①增加this指针作为参数。②将函数内部对成员的访问改写成经由this指针访问③将成员函数重新写成一个经过mangling的外部函数。 2。Name Mangling:函数的名字被编译器修改成内部使用的名字,用 阅读全文
posted @ 2021-06-23 12:06 放不下的小女孩 阅读(124) 评论(0) 推荐(0)
摘要:一、非多态继承 1.派生类中每个基类的子对象都要保持其完整性,即每个子对象都与独立对象内存布局相同,都会经过alignment(会造成代码膨胀) class Concrete1{ public: //…… private: int val; char bit1; }; ​ class Concret 阅读全文
posted @ 2021-06-22 11:42 放不下的小女孩 阅读(92) 评论(0) 推荐(0)
摘要:一、类成员的布局 1.静态数据成员布局在全局变量区。不同类的同名静态成员变量,编译器会对其进行编码来进行区分。 2.非静态成员的布局要求:在同一访问域(pubiic、private和protect)中后出现的成员在类对象中要有较高地址。(所以地址不一定连续、中间会有边界调整alignment产生的内 阅读全文
posted @ 2021-06-21 12:17 放不下的小女孩 阅读(58) 评论(0) 推荐(0)
摘要:现在编译器编译类时按照如下顺序: ①类成员的声明 ②成员函数的函数体在类全部可见后开始编译 而类成员的编译顺序则按照成员在类中的声明顺序进行编译,其中类成员包括:①数据成员②成员函数③嵌套类型(nested type)④枚举成员⑤模板成员。 由于成员函数的声明包括返回类型,函数名和形参列表。所以其中 阅读全文
posted @ 2021-06-19 12:33 放不下的小女孩 阅读(88) 评论(0) 推荐(0)
摘要:1.普通空类(空类,单一继承的空类,多重继承的空类)的大小:一般编译器会插入一个char(1byte)作为标识,使不同类获得独一无二的地址。(只有空类占一个char,虽然他的基类也是空类但是现在的编译器一般不会为他分配一个char,因为这样没有意义) 2.含有虚基类的空类的大小:受三个因素影响 ①语 阅读全文
posted @ 2021-06-18 19:38 放不下的小女孩 阅读(148) 评论(0) 推荐(0)
摘要:记录一下第二章成员初始化列表的笔记 1.使用条件:构造函数中 2.使用情形:下列四种情况必须使用成员初始化列表 ①初始化一个引用成员时 ②初始化一个常量成员时 ③调用一个基类的构造函数,而他拥有一组参数时 ④调用一个成员类的构造函数,而他拥有一组参数时 3.编译器对初始化列表所做的工作 编译器将初始 阅读全文
posted @ 2021-06-17 16:16 放不下的小女孩 阅读(102) 评论(0) 推荐(0)
摘要:记录一下第二章的第二部分笔记 一、拷贝构造函数 1.拷贝构造函数的生成: 同默认构造函数一样,概念上编译器会在需要调用拷贝构造函数时生成一个合成的拷贝构造函数,但实际上仅为有意义nontrival的类生成,对于trivial的类则使用逐比特拷贝bitwise copies(我理解为简单的将成员变量复 阅读全文
posted @ 2021-06-16 22:18 放不下的小女孩 阅读(123) 评论(0) 推荐(0)
摘要:记录一下第二章的第一部分默认构造函数的学习笔记: 一、默认构造函数 1.默认构造函数的生成: 概念上只要类未定义任何构造函数并且真正需要默认构造函数(被调用)时,则编译器会自动为其合成一个默认构造函数。而实际上编译器只为有意义nontrival的类合成构造函数。而无意义的类编译器为其合成无意义的默认 阅读全文
posted @ 2021-06-16 17:39 放不下的小女孩 阅读(113) 评论(0) 推荐(0)
摘要:记录一下第一章关于对象中的笔记。 1.指针类型 众所周知所有的指针都是存放着一个地址他们在同一个机器中占用的内存相同,而指针类型则是告诉编译器如何解释指针所指地址中的内存内容和大小。所以 ①一个类型为void*的指针只能获得地址,而不能对其指向的内容进行操作。 ②转换cast仅是一种编译器指令,它仅 阅读全文
posted @ 2021-06-16 11:27 放不下的小女孩 阅读(55) 评论(0) 推荐(0)