C++
文章平均质量分 76
C++学习
优雅的疯
这个作者很懒,什么都没留下…
展开
-
《C++标准库》第5章 通用工具
《C++标准库》第5章 通用工具pair和tuple便捷函数make_pair()Template函数make_pair(),能够让我们无须写出类型就能生成一个pair对象。make_pair函数的自动推断有时候可能并非用户所想,一个表达式用户明白的指出类型时,产生出来的pair将有绝对明确的类型Tuple(不定数的值组)Tuple中的每个类型由默认构造函数初始化,基础类型都会被初始化为0get函数所需要的index必须在编译期已知,运行期再传入一个值是不被允许的:便捷函数ref和原创 2021-04-01 12:44:11 · 304 阅读 · 0 评论 -
《C++标准库》第4章 一般概念
《C++标准库》第4章 一般概念头文件引入c标准头文件时,采用前缀字符c,不再采用扩展名.h为了向后兼容于C,旧式的C标准头文件仍然有效差错与异常处理针对语言支持而设计的异常类针对逻辑差错而设计的异常类针对运行期差错而设计的异常类异常类的头文件以Class exception_ptr传递异常C++11以后,可以将异常存储在exception_ptr对象中,稍后再在其他情景下使用可被调用对象当使用bind绑定类成员函数时,需要附带而外的对象指针,表示调用的是哪个对象原创 2021-04-01 12:42:51 · 67 阅读 · 0 评论 -
《C++标准库》第3章 语言新特性
《C++标准库》第3章 语言新特性nullptrnullptr是个新关键词,它会自动转换为各种pointer类型,但不会被转换为任何整数类型第二个函数调用会发生歧义,而第三个就不会一致性初始化C++11引入一致性初始化概念,意思是面对任何初始化动作,你可以使用相同语法,也就是使用大括号,以下皆成立:即使某个local变量属于基础类型(通常会有不明确的初值),也会被初始化为0窄化,也就是所谓的精度降低或造成数值变动——对大括号而言是不成立的初值列初始值列里存在迭代器,使用auto来原创 2021-04-01 12:42:00 · 73 阅读 · 0 评论 -
力扣刷题:19. 删除链表的倒数第 N 个结点(翻转链表模板题!!!)
题目要求版本一:使用vector容器装结点指针(不知道这种方法在面试的时候能不能用…)整体思路创建一个存放结点指针的容器,遍历并将整个链表存储进容器之中。根据n算出需要删除的节点位置indexDelete删除时需要分情况讨论:如果indexDelete=0,为删除头结点或者只存在一个节点。只需令head = head->next即可。如果indexDelete=尾节点,为删除尾节点。只需令倒数第二个节点的next指向nullprt即可。其它情况为删除中间节点。只需令indexDel原创 2021-03-31 12:20:19 · 85 阅读 · 0 评论 -
《Effective C++》 读书笔记 条款51-55
Effective C++ 51-55 Note条款51:编写new和delete时需固守常规operator new应该内含一个无限循环,并在其中尝试分配内存,如果它无法满足内存需求,就该调用new-handleroperator new应该有能力处理0bytes申请。Class专属版本还应该处理“比正确大小更大的申请”这里的new操作是基类的定制操作,而不是在派生类上使用。当传入一个size时,与基类的大小比较,如果它比基类的大小要大,则判断传入的是派生类,此时要调用标准new而不是定制原创 2021-03-24 11:42:12 · 134 阅读 · 0 评论 -
《Effective C++》 读书笔记 条款46-50
Effective C++ 46-50 Note条款46:需要类型转换时请为模板定义非成员函数当我们编写一个class template,而它所提供之“于此template相关的”函数支持“所有参数之隐式类型转换”时,请将那些函数定义为“class template内部的friend函数”先看一个编译错误:上述的乘法无法通过编译,在调用模板函数operator*时,oneHalf的类型是Rational,2的类型是int。编译器不会执行隐式转换,所以它不知道该调用那个类型的具现化函数。解决方法原创 2021-03-24 11:40:52 · 106 阅读 · 0 评论 -
《Effective C++》 读书笔记 条款41-45
Effective C++ 41-45 Note条款41:了解隐式接口和编译器多态### Templates及泛型编程的领域中,隐式接口和编译期多态比较重要。隐式接口:w必须支持的接口由template中执行于w身上的操作决定:size、normalize、swap、copy构造函数、!=编译期多态:凡涉及w的任何函数调用,都可能造成template的具现化。不同template参数会导致调用不同的函数条款42:了解typename的双重意义声明template参数时,typename和cla原创 2021-03-24 11:39:22 · 68 阅读 · 0 评论 -
《Effective C++》 读书笔记 条款36-40
Effective C++ 36-40 Note条款36:绝不重新定义继承而来的non-virtual函数如果D重新定义函数mf:非虚函数都是静态绑定的,指针是什么类型就调用什么类型。如果派生类重新定义了非虚函数,就会发生遮掩,导致派生类和基类调用的函数版本不一样!条款37:绝不重新定义继承而来的缺省参数值绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定的,而virtual函数却是动态绑定的因为函数参数是动态绑定的,如果在派生类的虚函数中重写了缺省参数值,当通过一个指向派原创 2021-03-22 23:33:46 · 96 阅读 · 0 评论 -
《Effective C++》 读书笔记 条款31-35
Effective C++ 31-35 Note条款31:将文件间的编译依存关系降至最低如果没有很好的实现“将接口从实现中分离”,那么在后续修改类时,重新编译会很耗时间。当引入头文件时,会出现编译依存关系:在使用标准库时,引入标准头文件不会引发编译的相互依赖,可以放心引入标准头文件编译器必须在编译期间知道对象的大小支持“编译依存最小化”的一般构想是:相依于声明式,不要相依于定义式。具体实现依赖于Handle classes和Interface classes这里有两个类,一个类是接口类原创 2021-03-21 23:25:15 · 125 阅读 · 0 评论 -
《Effective C++》 读书笔记 条款26-30
Effective C++ 26-30 Note条款26:尽可能延后变量定义式的出现时间等到出现有意义值时再定义,避免无意义的默认构造函数(习惯使用拷贝构造函数)条款27:尽量少做转型动作C++提供的四种新式转型方法宁可使用新式转型,也不要使用旧式转型。前者很容易辨别出来,而且也比较有着分门别类的职掌如果可以,尽量避免转型,特别是在重视效率的代码中避免dynamic_castsdynamic_cast用于将一个基类转换为派生类,之所以需要它,是因为你想在一个你认为是派生类的基类对象中原创 2021-03-21 23:24:04 · 97 阅读 · 0 评论 -
《Effective C++》 读书笔记 条款21-25
Effective C++ 21-25 Note条款21:必须返回对象时,别妄想返回其reference在看到一个reference表达式的时候,应该立即问自己:它的另一个名称是什么?绝不要返回pointer或reference指向一个local stack对象local stack对象就是在函数中不用new得到的局部变量,这个局部变量会在退出函数时自动销毁。返回的指针或引用会指向一个不存在的对象。绝不要返回以一个reference指向一个heap-allocated对象heap-allocat原创 2021-03-21 23:22:43 · 164 阅读 · 0 评论 -
《Effective C++》 读书笔记 条款16-20
Effective C++ 16-20 Note条款16:成对使用new和delete时要采用相同形式如果你在new表达式中使用[],必须在相应的delete表达式中也使用[]。如果你在new表达式中没有使用new,一定不要在相应的delete表达式中使用[]单一对象的内存布局与数组的内存布局不一样,数组需要额外的空间记录数组大小,可以把两者的内存情况理解为下图:如果对一个单一对象使用delete[],编译器会按照删除数组的形式寻找对应的n,读取到本不应该存在的n。然后错误的多次析构。而对数组对原创 2021-03-14 12:12:08 · 105 阅读 · 0 评论 -
《Effective C++》 读书笔记 条款11-15
Effective C++ 11-15 Note条款11:在operator=中处理“自我赋值”确保当对象自我赋值时,拷贝赋值函数有良好的行为。其中的技术包括比较“来源对象”和“目标对象”的地址、精心周到的语句顺序、以及copy-and-swap比较“来源对象”和“目标对象”:复制:pb在new操作之后已经指向了一块新的内存地址,所以delete原来地址也是没问题的。copy-and-swap:第一个版本为引用版本,需要利用拷贝构造函数构造一个临时对象,然后让源数据与该临时对象进行交换原创 2021-03-14 12:03:04 · 108 阅读 · 0 评论 -
《Effective C++》 读书笔记 条款6-10
Effective C++ 6-10 Note条款06:若不想使用编译器自动生成的函数,就明确拒绝在老版的C++中,将不想自动生成的函数声明为private并且不定义在当前版本的C++中,可以使用delete修饰符进行修饰条款07:为多态基类声明virtual析构函数带多态性质的基类应该声明一个虚析构函数,如果类带有任何虚函数,它就应该有一个虚析构函数当出现基类指针或引用指向派生类对象时,如果析构函数不为虚函数,那么调用的就是静态对象的析构函数,也就是基类的析构函数,这会导致派生类的派生部分没原创 2021-03-12 10:21:46 · 102 阅读 · 0 评论 -
《Effective C++》 读书笔记 条款1-5
Effective C++ 1-5条款01:视C++为一个语言联邦C++大体上由四个次语言组成:C、object-oriented C++、Template C++、STL条款02:尽量以const、enum、inline替换 #defineconst替换#define x 1.653当上述语句发生错误时,编译器只会报告1.653出错,而不是报告x出错。在大工程环境下,只凭1.653这个数字去debug十分费劲。建议使用const替换上述语句enum替换:the enum hack在类里面原创 2021-03-12 00:09:11 · 74 阅读 · 0 评论 -
《C++ Primer》 读书笔记——第十九章 特殊工具与技术
第十九章 特殊工具与技术19.1 控制内存分配1. 重载new和delete执行new表达式的三步操作:调用operator new的标准库函数,分配一块内存空间在内存空间上使用构造函数构造对象,初始化返回指向该对象的指针new和delete接口malloc函数与free函数当定义自己的new和delete函数时,需要用到malloc函数和free函数2. 定位new表达式向new中传入指定内存地址,允许我们在一个特定的、预先分配的内存地址上构造对象19.2 运行时类型识原创 2021-03-08 22:24:54 · 126 阅读 · 0 评论 -
《C++ Primer》 读书笔记——第十八章 用于大型程序的工具
第十八章 用于大型程序的工具18.1 异常处理1. 抛出异常try、throw、catch(踹扔抓)栈展开寻找对应的catch语句的过程称之为栈展开没找到相应的catch语句,程序会终止栈展开过程中对象被自动销毁栈展开可能会跳过某个局部块,此时该块里面的所有局部对象都将被销毁析构函数与异常析构函数不能抛出自己处理不了的异常,更近一步,析构函数最好不要抛出异常异常对象完全类型简单来说就是在throw语句使用之前已经定义好的类。只声明没有定义就是不完全类型不要抛出一个指原创 2021-03-08 21:10:11 · 99 阅读 · 0 评论 -
《C++ Primer》 读书笔记——第十七章 标准库特殊设施
后面三章划重点的截图会多一些,我的水平太差,现在还无法用自己的语言描述这些概念…第十七章 标准库特殊设施17.1 tuple类型类似于pair的概念,将一堆变量打包装进一个tuple里面1. 定义和初始化tupletuple是一个模板,需要指出所有成员的类型2. 必须使用直接初始化3. 访问tuple成员使用 get() , i表示一个正整数17.2 bitset 类型方便的进行位运算,处理二进制数1. 定义和初始化 bitsetbitset是一个模板类,需要给出二进制数原创 2021-03-08 15:21:13 · 128 阅读 · 0 评论 -
《C++ Primer》 读书笔记——第十六章 模板与泛型编程
第十六章 模板与泛型编程16.1 定义模板1. 函数模板写法在函数开头加上:template 其中模板参数T表示要传入的类型实例化函数模板当编译器实例化一个模板时,它使用实际的模板实参代替对应的模板参数来创建出模板的一个新“实例”。(创建一个新的版本)非类型模板参数非类型模板参数是一个值而非一个类型inline和constexpr修饰的函数模板inline在模板参数列表之后,在函数返回类型之前泛型编码的两个重要原则第一个原则是为了避免复制从而提高效率,同时保证不更改引用原创 2021-03-07 22:06:48 · 134 阅读 · 0 评论 -
《C++ Primer》 读书笔记——第十五章 面向对象程序设计
第十五章 面向对象程序设计15.1 OOP:概述1. 面向对象的的核心思想是数据抽象、继承和动态绑定通过使用数据抽象将类的接口与实现分离。使用继承,定义相似类型并对其相似关系建模。使用动态绑定,在一定程度上忽略相似类型的区别,以统一的方式使用它们的对象。2. 继承的写法:类派生列表3. 虚函数的写法函数返回值类型前加上virtual修饰符15.2 定义基类和派生类1. 虚函数的解析过程发生在运行时虚函数存在动态绑定,需要在运行时才能确定执行该函数的对象到底是基类还是派生类。而其它原创 2021-03-07 20:44:01 · 260 阅读 · 0 评论 -
《C++ Primer》 读书笔记——第十四章 重载运算与类型转换
第十四章 重载运算与类型转换14.1 基本概念• 重载运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成。• 如果一个运算符函数是成员函数,则它的第一个运算对象绑定到隐式的this指针上• 对于一个运算符函数来说,它或者是类的成员,或者至少含有一个类类型的参数:这一约定意味着当运算符作用于内置类型的运算对象时,我们无法改变该运算符的含义。1、可以重载的运算符通常情况下,不应该重载逗号,取地址,逻辑与和逻辑或运算符。上述运算符的重载版本无法保存求值原创 2021-03-05 11:56:29 · 176 阅读 · 1 评论 -
《C++ Primer》 读书笔记——第十三章 拷贝控制
第十三章 拷贝控制13.1 拷贝、赋值与销毁1、拷贝构造函数①、基本概念拷贝构造函数的第一个参数是自身的引用,并且任何额外的参数都有默认值。合成拷贝构造函数:如果没有为类定义拷贝构造函数,则编译器会为我们定义一个,称之为合成拷贝构造函数。一般情况,合成的拷贝构造函数会将其参数的成员逐个拷贝到正在创建的对象中②、拷贝初始化直接初始化:使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数拷贝初始化:将右侧运算对象拷贝到正在创建的对象中拷贝初始化发生的情况:③、为什么拷贝构造函数的参原创 2021-03-05 08:55:15 · 164 阅读 · 1 评论 -
《C++ Primer》 读书笔记——第十二章 动态内存
第十二章 动态内存12.1 动态内存和智能指针1、new和deleteC++的动态内存管理是通过new和delete来完成的new:在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象进行初始化delete:接受一个动态对象指针,摧毁该对象,并释放与之相关的内存我们经常会忘记delete,所以推荐使用智能指针2、三种智能指针shared_ptr:允许多个指针指向同一个对象unique_ptr:“独占”所指向的对象weak_ptr:是一种弱引用,指向shared_ptr原创 2021-03-04 11:39:11 · 101 阅读 · 1 评论 -
《C++ Primer》 读书笔记——第十一章 关联容器
第十一章 关联容器map和multimap定义在头文件map中;set和multiset定义在头文件set中无序容器则定义在头文件unordered_map和unordered_set中11.1 使用关联容器1、使用map的简单例子for循环读取map得到的是pair类型2、使用set的简单例子map和set是模板,都需要指定元素类型11.2 关联容器概述1、关联容器对关键字类型的限制2、有序容器的关键字类型满足严格弱序3、自定义操作的set需要自己做一个函数,这个函数原创 2021-02-26 17:15:21 · 84 阅读 · 0 评论 -
《C++ Primer》 读书笔记——第十章 泛型算法
第十章 泛型算法10.1 概述1、与泛型算法相关的头文件大多数算法定义在头文件algorithm中头文件numeric定义了数值泛型算法2、算法不会执行容器操作算法不执行容器操作(上一章介绍的容器函数),而是使用迭代器。迭代器的使用令算法不依赖于容器类型(有些容器有这个函数,有些容器没有这个函数)10.2 初始泛型算法1、accumulate设置和的初始值,计算给定范围内的和它将第三个参数作为求和的起点,并且默认序列中元素的类型与第三个参数可以相加,并且类型兼容。2、对于只读算法原创 2021-02-26 16:40:33 · 94 阅读 · 0 评论 -
《C++ Primer》 读书笔记——第九章 顺序容器
第九章 顺序容器9.1 顺序容器概述一般情况下推荐使用vector9.2 容器库概略所有容器库通用的操作1、const类型的迭代器当不需要进行写访问时,最好使用cbegin和cend2、容器的定义和初始化3、容器间的拷贝问题将一个新容器创建为另一个容器的拷贝的方法有两种:可以直接拷贝整个容器;或者拷贝一个由迭代器指定的元素范围。直接拷贝容器需要类型相同才能够拷贝。而通过迭代器拷贝只需要类型兼容就可以。4、array具有固定大小array的大小也是类型的一部分在对arra原创 2021-02-26 12:36:44 · 97 阅读 · 0 评论 -
《C++ Primer》 读书笔记——第八章 IO库
第八章 IO库8.1 IO类1、IO对象无拷贝或赋值我们不能拷贝或对IO对象赋值2、IO流的条件状态可以使用循环判断流条件来读取文件3、管理输出缓冲endl、ends、flush8.2 文件输入输出1、fstream特有的操作2、创建文件流创建文件流时,如果给构造函数一个默认的文件名参数的话,就默认当作已经调用了open函数。否则需要在之后关联后再调用open函数。3、可以用子类代替父类fstream继承自iostream, 所以可以将fstream当作函数参数传入需原创 2021-02-26 11:49:24 · 66 阅读 · 0 评论 -
《C++ Primer》 读书笔记——第七章 类
第七章 类7.1 定义抽象数据类型1、抽象数据类型只能访问函数,不能访问成员变量的类称为抽象数据类型2、*this当返回值为*this时,返回的是调用该方法实例的引用类型(左值)。3、IO类型的参数不能被拷贝IO类型作为函数参数时,只能使用引用而不能使用拷贝。4、默认构造函数只有当类没有声明任何构造函数时,编译器才会生成默认的构造函数5、构造函数初始值列表在构造函数中,函数参数后使用冒号以及成员变量名加括号初始值的形式为类的成员变量赋初始值因为构造函数的目的就是初始化成员变量,所原创 2021-02-26 11:12:20 · 152 阅读 · 0 评论 -
《C++ Primer》 读书笔记——第四章 表达式
第四章 表达式4.1 基础1、左值和右值当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)4.2 算术运算符1、除法截断C++11标准规定商一律向0取整(即直接切除小数部分)4.3 逻辑和关系运算符1、短路求值,提高效率2、巧用引用,省去拷贝的开销一般传入参数的大小比较大,值传递时拷贝比较麻烦,考虑使用引用传递。4.5 递增和递减运算符1、除非必要,否则不使用后置递减运算符前置版本的递增运算符避免了不必要的工作原创 2021-01-14 16:43:23 · 88 阅读 · 0 评论 -
《C++ Primer》 读书笔记——第三章 字符串、向量、数组
第三章 字符串、向量、数组1、size_t表示无符号整数,为unsigned类型。它可以表示的正数范围是int的两倍。当确定该变量的值一定大于等于0时,选用size_t类型而不用int类型。在for循环中使用size_t使用size_t有很多好处,这里贴一个专门介绍这些好处的文章:为什么size_t重要2、无符号数和有符号数的运算问题无符号数和有符号数进行运算时,有符号数会被转换为无符号数。所以就要注意下面的问题:3、cin读入字符串时,会忽略打头的空白部分4、字符串相加时需要注意原创 2021-01-14 16:08:39 · 87 阅读 · 0 评论 -
《C++ Primer》 读书笔记——第二章 变量和基本类型
第二章 变量和基本类型1、编写自己的头文件时,养成加上头文件保护符的习惯2、常量表达式的声明3、在定义完类后,记得加上分号4、声明时,将引用和指针看作声明符的一部分int a,*b,&c = a;a的类型是intb的类型是int*c的类型是int&5、在声明指针时,最好将指针初始化为nullptr6、同名的局部变量会覆盖全局变量7、变量的初始化很重要8、声明和定义的区别...原创 2021-01-14 12:01:56 · 107 阅读 · 0 评论 -
《C++ Primer》 读书笔记——第五章 语句
第五章 语句5.1 简单语句1、空语句可以用分号表示一个空语句当语法需要但是逻辑不需要的时候可以使用空语句。使用空语句时应该加注释,否则很难读懂2、语句块不以分号结束5.3 条件语句1、switch语句的内部变量定义不允许在其中一个标签中定义变量,因为程序执行时可能会跳过这个标签,这样在其它标签使用就会出问题。如果真的需要在switch标签内部定义变量,则应使用语法块来限制范围5.4 迭代语句1、for语句中的对象定义for语句的初始条件中可以定义多个对象,但是对象的类原创 2021-01-14 17:02:50 · 66 阅读 · 0 评论 -
《C++ Primer》 读书笔记——第六章 函数
第六章 函数6.1 函数基础1、在函数体中,一旦遇到return语句就交还控制流给调用方这意味着,在for循环或者while循环中,当遇到return时就直接退出,不再继续执行循环。2、函数返回类型不能是数组3、局部变量初始化如果在定义变量时没有给定初始值,则变量会执行默认初始化。而默认初始化有两种情况:如果变量是内置类型(int、char、float),则该变量的值是未定义的。使用这些未定义的变量将会引发错误。如果变量是用户自定义类,则会执行类的默认构造函数。建议在定义内置类型的变量时,原创 2021-01-29 18:00:02 · 231 阅读 · 0 评论