C++ primer 5
c++ primer. study. record
Error Man
我是菜逼
展开
-
shared_ptr 的内存泄漏
#include <bits/stdc++.h>#include <memory>using namespace std;class B;class A {public: A() { std::cout << "A()" << std::endl; } ~A() { std::...原创 2020-04-09 18:38:23 · 552 阅读 · 0 评论 -
C++模板与泛型编程:模板特例化
文章目录模板特例化定义函数模板特例化函数重载与模板特例化类模板特例化类模板部分特例化特例化成员而不是类模板特例化 编写单一模板,使之对任何可能的模板实参都是最合适的,都能实例化,这并不总是能办到。在某些情况下,通用模板的定义对特定类型是不适合的:通用定义可能编译失败或做得不正确。其他时候,我们也可以利用某些特定知识来编写更高效的代码,而不是从通用模板实例化。当我们不能 (或不希望) 使用模板...原创 2020-03-14 11:43:32 · 473 阅读 · 0 评论 -
C++模板与泛型编程:可变参数模板
文章目录可变参数模板sizeof... 运算符编写可变参数函数模板包扩展理解包扩展转发参数包 (emplace_back实现)可变参数模板 一个可变参数模板就是接受一个可变数目参数的模板函数或模板类。可变数目的参数被称为参数包。存在两种参数包:模板参数包,表示零个或多个模板参数;函数参数包,表示零个或多个函数参数。 我们用一个省略号来指出一个模板参数或函数参数表示一个包。在一个模板参数列...原创 2020-03-13 16:39:53 · 634 阅读 · 0 评论 -
C++模板与泛型编程:模板实参推断与引用,理解std::move,与转发 (std::forward)
文章目录模板实参推断与引用从左值引用函数参数推断类型从右值引用函数参数推断类型引用折叠和右值引用参数编写接受右值引用参数的模板函数理解 std::movestd::move 是如何定义的std::move 是如何工作的从左值 static_cast 到一个右值引用是允许的转发定义能保持类型信息的函数参数在调用中使用 std::forward 保存类型信息模板实参推断与引用 为了理解如何从函数...原创 2020-03-12 19:41:49 · 540 阅读 · 0 评论 -
C++模板与泛型编程:模板实参推断 (类型转换与模板类型实参、函数模板显式实参、尾置返回类型与类型转换、函数指针和实参推断)
文章目录模板实参推断类型转换与模板类型实参使用相同模板参数类型的函数形参正常类型转换应用于普通函数实参函数模板显式实参指定显式模板实参正常类型转换应用于显式指定的实参尾置返回类型与类型转换进行类型转换的标准库模板类函数指针和实参推断模板实参推断 我们知道,对于函数模板,编译器利用调用中的函数实参来确定其模板参数。从函数实参来确定模板实参的过程被称为模板实参推断。在模板实参推断过程中,编译器使...原创 2020-03-12 17:16:25 · 669 阅读 · 0 评论 -
C++模板与泛型编程:模板参数、成员模板、控制实例化(实例化声明与定义)、效率与灵活性(智能指针删除器的工作方式)
文章目录模板参数模板参数与作用域模板声明使用类的类型成员 (typedef typename vector模板参数 类似函数参数的名字,一个模板参数的名字也没有什么内在含义。我们通常将类型参数命名 T,但实际上我们可以使用任何名字:template<typename Foo> Foo calc(const Foo& a,const Foo &b) { Fo...原创 2020-03-11 16:30:08 · 441 阅读 · 0 评论 -
C++模板与泛型编程:类模板
文章目录定义模版类模板定义类模板实例化类模板在模板作用域中引用模板类型类模板的成员函数check 和 元素访问成员Blob 构造函数类模板成员的实例化在类代码内简化模板类名的使用在类模板外使用模板名类模板和友元一对一友好关系通用和特定的模板友好关系令模板自己的类型参数成为友元模板类型别名类模板的 static 成员定义模版类模板 类模板是用来生成类的蓝图的。与函数模板的不同之处是,编译器不...原创 2020-03-10 14:32:54 · 541 阅读 · 0 评论 -
C++模板与泛型编程:模板函数
文章目录定义模板函数模板实例化函数模板模板类型参数非类型模板参数inline 和 constexpr 的函数模板编写类型无关的代码模板编译大多数编译错误在实例化期间报告定义模板假设我们希望编写一个函数来比较两个值,并指出第一个值与第二个的大小关系。在实际中,我们可能需要定义多个函数,每个函数比较一种给定类型的值。我们的代码可能是这样的:int compare(const string &am...原创 2020-03-09 20:06:45 · 187 阅读 · 0 评论 -
C++面向对象程序设计:虚函数、抽象基类、访问控制与继承
文章目录前提虚函数对虚函数的调用可能在运行时才被解析派生类中的虚函数final 和 override 说明符虚函数和默认实参回避虚函数的机制抽象基类纯虚函数含有纯虚函数的类是抽象基类派生类构造函数只初始化它的直接基类访问控制与继承受保护的成员公有、私有和受保护继承派生类向基类转换的可访问性友元与继承改变个别成员的可访问性默认的继承保护级别前提 有如下代码,表示一本书籍的信息以及该书的打折方案...原创 2020-03-07 17:22:40 · 712 阅读 · 0 评论 -
C++面向对象程序设计:OOP概述、定义基类与派生类
文章目录OOP 概述继承动态绑定定义基类和派生类定义基类成员函数与继承访问控制与继承定义派生类派生类中的虚函数派生类对象及派生类向基类的类型转换派生类构造函数派生类使用基类的成员继承与静态成员派生类的声明被用作基类的类防止继承的发生类型转换与继承静态类型与动态类型不存在基类向派生类的隐式类型转换…………在对象之间不存在类型转换OOP 概述 很多程序中都存在着一些相互关联但有细微差别的概念。例...原创 2020-03-06 16:25:42 · 808 阅读 · 0 评论 -
C++重载运算与类型转换:类型转换运算符,及相关联的二义性问题
文章目录重载、类型转换与运算符类型转换运算符定义含有类型转换运算符的类类型转换运算符可能产生意外结果显示的类型转换运算符转换为 bool避免有二义性的类型转换实参匹配和相同的类型转换二义性与转换目标为内置类型的多重类型转换重载函数与转换构造函数重载函数与用户定义的类型转换函数匹配与重载运算符重载、类型转换与运算符 我们知道,当类的构造函数之后一个形参时,我们可以隐式的进行类型转换,这种构造函...原创 2020-03-05 17:02:23 · 1564 阅读 · 0 评论 -
C++重载运算:函数调用运算符
文章目录函数调用运算符含有状态的函数对象类lambda 是函数对象表示 lambda 及相应捕获行为的类标准库定义的函数对象在算法中使用标准库函数对象练习 14.42可调用对象与 function不同类型可能具有相同的调用形式标准库 function 类型重载函数与 function函数调用运算符 如果类重载了函数调用运算符,则我们可以像使用函数一样使用该类的对象。因为这样的类同时也能存储状...原创 2020-03-05 12:30:16 · 2695 阅读 · 0 评论 -
C++拷贝控制:右值引用、移动构造函数、移动赋值运算符
文章目录对象移动右值引用左值持久,右值短暂变量是左值标准库 move 函数移动构造函数和移动赋值运算符移动操作、标准库容器和异常移动赋值运算符移后源对象必须可析构(即移后源对象处于销毁它是无害的状态)合成的移动操作移动右值,拷贝左值…………但如果没有移动构造函数,右值也被拷贝拷贝并交换赋值运算符与移动操作对象移动 新标准一个最主要的特性是可以移动而非拷贝对象的能力。在某些情况下,对象拷贝后就...原创 2020-03-03 18:03:45 · 1046 阅读 · 0 评论 -
C++拷贝控制:动态内存管理类(简化的vector<string>实现)
文章目录动态内存管理类StrVec 类的设计StrVec 类定义使用 constructalloc_n_copy 成员free 成员拷贝控制成员在重新分配内存的过程中移动而不是拷贝元素移动构造函数和 std::movereallocate 成员动态内存管理类 某些类需要在运行时动态分配可变大小的内存。这种类通常可以使用标准库容器来保存它们的数据。但是这一策略并不是对每个类都适用。某些类需要自...原创 2020-03-03 09:30:26 · 422 阅读 · 0 评论 -
C++拷贝控制:拷贝控制实例
文章目录拷贝控制实例Message 类save 与 remove 成员Mes 类的拷贝控制成员Message 的析构函数Message 的拷贝赋值运算符Message 的 swap 函数练习 13.37总结拷贝控制实例 虽然通常来说分配资源的类更需要拷贝控制,但资源管理并不是一个类需要定义自己的拷贝控制成员的唯一原因。一个类也需要拷贝控制的帮助来进行薄记工作。 这里我们将概述两个类的设...原创 2020-03-02 19:51:42 · 441 阅读 · 0 评论 -
C++拷贝控制:swap操作 (应用于重载赋值运算符,程序优化等)
文章目录前提swap 操作编写我们自己的 swap 函数swap 函数应该调用 swap,而不是 std::swap在赋值运算符中使用 swap前提 有 HasPtr 类:class HasPtr {public: HasPtr(const std::string &s = std::string()) : ps(new std::string(s...原创 2020-03-01 16:21:37 · 2075 阅读 · 3 评论 -
C++拷贝控制:拷贝控制与资源管理
文章目录拷贝控制和资源管理行为像值的类(如 string)类值拷贝赋值运算符定义行为像指针的类(如 shared_ptr)引用计数定义一个使用引用计数的类类指针的拷贝成员“篡改”引用计数拷贝控制和资源管理 通常,管理类外资源的类必须定义拷贝控制成员。为了定义这些成员,我们首先确定此类型对象的拷贝语义。一般来说,有两种选择:可以定义拷贝操作,使类的行为看起来像一个值或像一个指针。 类的行为...原创 2020-03-01 15:02:22 · 272 阅读 · 0 评论 -
C++拷贝控制:拷贝构造函数、拷贝赋值运算符、析构函数、三/五法则、=default、阻止拷贝的方法
文章目录拷贝、赋值与销毁拷贝构造函数合成拷贝构造函数拷贝初始化参数和返回值拷贝初始化的限制编译器可以绕过拷贝构造函数拷贝赋值运算符重载赋值运算符合成拷贝赋值运算符析构函数析构函数完成什么工作什么时候会调用析构函数合成析构函数三/五法则需要析构函数的类也需要拷贝和赋值操作需要拷贝操作的类也需要赋值操作,反之亦然使用 =default阻止拷贝定义删除函数(阻止拷贝、赋值)析构函数不能是删除的成员合成的...原创 2020-02-29 16:42:42 · 921 阅读 · 0 评论 -
C++动态内存与智能指针:动态数组与 allocator 类。赋练习 12.2.2
文章目录动态数组new 和数组分配一个数组会得到一个元素类型的指针初始化动态分配对象的数组动态分配一个空数组是合法的释放动态数组智能指针和动态数组allocator 类问题引入allocator 类allocator 分配、回收内存拷贝和填充未初始化内存的算法练习 12.26动态数组 C++语言和标准库提供了两种一次分配一个对象的数组的方法。一:支持另一个 new 表达式语法,可以分配并初始...原创 2020-02-28 11:22:58 · 429 阅读 · 0 评论 -
C++动态内存与智能指针:unique_ptr 与 weak_ptr。赋练习 12.1.6 之 12.20
文章目录unique_ptr传递 unique_ptr 参数和返回 unique_ptr向 unique_ptr 传递删除器weak_ptr核查指针类指针操作练习 12.20unique_ptr 一个 unique_ptr ”拥有“ 它所指向的对象。某个时刻只能有一个 unique_ptr 指向一个给定对象。当 unique_ptr 销毁时,它所指向的对象也被销毁。下面是 unique_pt...原创 2020-02-27 16:51:06 · 295 阅读 · 0 评论 -
C++动态内存与智能指针:shared_ptr和new结合使用、智能指针和异常
文章目录shared_ptr 和 new 结合使用不要混合使用普通指针和智能指针…………也不要使用 get 初始化另一个智能指针或为智能指针赋值其他 shared_ptr 操作智能指针和异常智能指针和哑类使用我们自己的释放操作shared_ptr 和 new 结合使用 我们知道,如果不初始化智能指针,它就会被初始化为一个空指针。其实还可以用 new 返回的指针来初始化智能指针:shared...原创 2020-02-26 19:15:01 · 724 阅读 · 0 评论 -
C++动态内存与智能指针:new 与 delete 直接管理动态内存
文章目录直接管理内存使用 new 动态分配和初始化对象动态分配的 const 对象内存耗尽释放动态内存指针值和 delete动态对象的生存期直到被释放时为止delete 之后重置指针值…………这只是提供了有限的保护直接管理内存 C++语言定义了两个运算符来分配和释放内存。运算符 new 分配内存,delete 释放 new 分配的内存。相对于智能指针,使用 new 和 delete 管理内存...原创 2020-02-26 14:31:40 · 494 阅读 · 0 评论 -
C++动态内存与智能指针:shared_ptr 类 及 C++ primer 5 练习 12.1.1
文章目录shared_ptr 类make_shared 函数shared_ptr 的拷贝和赋值shared_ptr 自动销毁所管理的对象,…………,shared_ptr 还会自动释放相关联的内存使用了动态生存期的资源的类(具体实例代码及注解)定义 StrBlob 类StrBlob 构造函数元素访问成员函数StrBlob 的拷贝、赋值和销毁12.1.1 节练习 使用动态内存很容易出现问题。例如:有...原创 2020-02-25 17:12:34 · 224 阅读 · 0 评论 -
C++关联容器:自定义 map 和 set 的元素比较方式
文章目录第一种方式,编写比较函数并传入实参第二种方式,重载运算符。。。(待更)第一种方式,编写比较函数并传入实参用来组织一个容器中元素的操作的类型也是该容器类型的一部分。为了指定使用自定义的操作,必须在定义关联容器类型时提供此操作的类型。自定义的操作类型必须在尖括号中紧跟着元素类型给出。 在尖括号中出现的每个类型,就仅仅是一个类型而已。当我们创建一个容器时,才会以构造函数参数的形式提供真正...原创 2020-02-24 19:33:05 · 299 阅读 · 0 评论 -
C++ primer 5,练习 10.4.2 (iostream迭代器)
10.29:使用流迭代器读取文本文件,存入 vector<string> 里面#include "bits/stdc++.h"using namespace std;int main() { ifstream fin("a.txt"); istream_iterator<string> in(fin), eof; vector<str...原创 2020-02-23 14:33:15 · 131 阅读 · 0 评论 -
C++ 再探迭代器:插入迭代器,iostream 迭代器 与 反向迭代器
文章目录再探迭代器插入迭代器iostream 迭代器istream_iterator 操作使用算法操作流迭代器istream_iterator 允许使用懒惰求值ostream_iterator 操作使用流迭代器处理类类型再探迭代器 除了每个容器定义的迭代器外,标准库头文件 iterator 中还定义了额外几种迭代器。包括以下类型:插入迭代器:这些迭代器被绑定到一个容器上,可用来向容器插入...原创 2020-02-23 14:22:42 · 476 阅读 · 0 评论 -
C++ 中的 lambda 表达式
文章目录lambda 表达式介绍 lambda向 lambda 传递参数使用捕获列表调用 find_iffor_each 函数完整的 biggieslambda 捕获和返回值捕获引用捕获隐式捕获可变lambda指定 lambda 返回类型lambda 表达式 现在有问题:求大于等于一个给定长度的单词有多少,并打印大于等于给定长度的单词。假设此函数为 biggies,其函数框架如下:void...原创 2020-02-22 15:47:16 · 455 阅读 · 0 评论 -
C++ 顺序容器:可能是顺序容器迭代器失效的操作
容器操作可能会使迭代器失效 向容器中添加元素和从容器中删除元素的操作可能会使指向容器元素的指针、引用或迭代器失效。使用失效的迭代器是一种严重的程序设计错误,很可能引起与未初始化指针一样的问题。 想容器中添加元素后:如果容器是 vector 或 string,且存储空间被重新分配,则指向容器的迭代器、指针和引用都会失效。如果存储空间未重新分配,指向插入元素之前的元素迭代器、指针和引用仍有...原创 2020-02-20 16:22:42 · 304 阅读 · 0 评论 -
C++ IO 库:文件的输入输出 (使用文件流对象 与 文件模式)
文章目录文件输入输出使用文件流对象用 fstream 代替 iostream&成员函数 open 和 close发现的问题自动构造和析构文件模式以 out 模式打开文件会丢弃已有数据每次调用 open 时都会确定文件模式文件输入输出 头文件 fstream 定义了三个类型来支持文件 IO:ifstream 从一个给定文件读取数据, ofstream 向一个给定文件写入数据。以及 fs...原创 2020-02-19 15:48:17 · 940 阅读 · 0 评论 -
C++ IO库:IO类型间的关系、流的条件状态、管理输出缓冲
文章目录IO 类IO类型间的关系IO 对象无拷贝或赋值条件状态查询流的状态管理条件状态管理输出缓冲刷新输出缓冲区unitbuf 操纵符关联输入和输出流IO 类 为了支持不同种类的 IO 处理操作,在 istream 和 ostream 之外,还定义了其他一些 IO 类型。分别定义了三个独立的头文件:iostream 定义了用于读写流的基本类型,fstream 定义了读写命名文件的类型,sst...原创 2020-02-19 15:44:51 · 363 阅读 · 0 评论 -
C++类:类的静态成员
文章目录类的静态成员声明静态成员使用类的静态成员定义静态成员静态成员的类内初始化静态成员能用于某些场景,而普通成员不能类的静态成员 有的时候类需要它的一些成员与类本身直接相关,而不是与类的各个成员保持关联。例如,一个银行账户类可能需要一个成员表示当前的基准利率。在此例中,我们希望利率与类关联,而非与类的每个对象关联。从实现效率的角度来看,没必要每个对象都存储利率信息。而且更加重要的是,一旦利...原创 2020-02-15 14:40:41 · 308 阅读 · 0 评论 -
C++类:构造函数再探之二(隐式的类类型转换、抑制构造函数定义的隐式转换、聚合类、字面值常量类)
前提 有 Sales_data 类:class Sales_data {// 做友元声明 friend Sales_data add(const Sales_data &,const Sales_data &); friend std::istream& read(std::istream&, Sales_data &); f...原创 2020-02-13 19:54:35 · 485 阅读 · 1 评论 -
C++ 类:构造函数再探之一(详见文章目录)
前提 有 Sales_data 类:class Sales_data {// 做友元声明 friend Sales_data add(const Sales_data &,const Sales_data &); friend std::istream read(std::istream&, Sales_data &); friend...原创 2020-02-13 10:30:08 · 308 阅读 · 0 评论 -
C++类:类的作用域与名字查找(寻找与所用名字最匹配的声明过程)
前提 有 Screen 类:class Screen {public: typedef std::string::size_type pos; // 当然,也可以用 using 声明类型别名 Screen() = default; // 因为有其他的构造函数,此默认构造函数是必须的 Screen(pos ht, pos wd, char c): ...原创 2020-02-12 12:34:53 · 525 阅读 · 0 评论 -
C++类:类类型、友元再探(友元类 与 其他类的成员函数做友元)
文章目录类类型友元再探类之间的友元关系令成员函数作为友元函数重载与友元友元声明和作用域类类型 每个类都定义了唯一的类型。对于两个类来说,即使它们的成员完全一样,这两个类也是不同的类型。struct First { int memi; int getmemi();};struct Second { int memi; int getmemi();};F...原创 2020-02-10 20:31:25 · 437 阅读 · 0 评论 -
C++类:类的其他特性(类成员再探、返回 *this 的成员函数)
文章目录类的其他特性类成员再探定义一个类型成员Screen 类的成员函数令成员作为内联函数重载成员函数可变数据成员类数据成员的初始值返回 *this 的成员函数从 const 成员函数返回 *this基于 const 的重载类的其他特性 这里主要特性包括:类型成员、类的成员的类内初始值、可变数据成员、内联成员函数、从成员函数返回 *this、如何定义并使用类类型以及友元的更多知识。类成员再...原创 2020-02-10 20:25:29 · 547 阅读 · 1 评论 -
C++类:访问控制与封装、友元初识
前提有Sales_data 类的定义以及非成员接口函数代码struct Sales_data { std::string isbn() const { return bookNo; } // 返回 isbn 编号 Sales_data& combine (const Sales_data&); // 模拟 += 运算 double avg_price...原创 2020-02-10 20:18:32 · 311 阅读 · 0 评论 -
C++ primer 练习 7.3.4:定义你自己的 Screen 和 Window_mgr,其中 clear 是 Window_mgr的成员,是 Sreen 的友元
按照书上出现的代码顺序:可以得出以下代码#include <vector>#include "iostream"class Screen;class Window_mgr {public: // 窗口中的每个屏幕编号 using ScreenIndex = std::vector<Screen>::size_type; void cle...原创 2020-02-10 14:47:05 · 670 阅读 · 2 评论 -
C++ 类:类相关的非成员函数、构造函数
**前提:**仍有 Sales_data 类的代码:struct Sales_data { std::string isbn() const { return bookNo; } // 返回 isbn 编号 Sales_data& combine (const Sales_data&); // 模拟 += 运算 double avg_price() c...原创 2020-02-07 18:25:19 · 2306 阅读 · 2 评论 -
C++ 类:成员函数,this,const成员函数,类作用域,类外部定义成员函数,定义返回 this 对象的函数 (return *this? 解决)
第一段第二段第三段设计Sales_data 类由 P21 中的 Sales_item.h 以及 书店程序代码 可知,Sale_item.h 中重载了运算符 << , >> , + , += , =。在这里我们将用函数的形式实现这几种操作。故,Sales_data 的接口应该包含以下操作:一个 isbn 成员函数,用于返回对象的 ISBN 编号一个 com...原创 2020-02-06 14:21:28 · 557 阅读 · 0 评论