![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 70
不要熬夜多喝热水
这个作者很懒,什么都没留下…
展开
-
Learn C++学习笔记:第M章—std :: weak_ptr解决std :: shared_ptr的循环依赖问题
为什么需要weak_ptr之前介绍的std::shared_ptr可以彼此共同管理一块内存,比喻的话,有点像链表,一个指针接一个指针,然后连接到内存上,释放一个指针这个链表少一个节(指)点(针)。所以潜在的问题就是如果是循环链表怎么办?具体举例如下:#include <iostream>#include <memory> // for std::shared_ptr#include <string> class Person{ std::string m原创 2021-02-26 18:55:03 · 402 阅读 · 0 评论 -
Learn C++学习笔记:第M章—shared_ptr智能指针:怎么让智能指针之间可以进行赋值
前面的文章已经提出了一个关键点,两个unique_ptr智能指针之间无法进行值传递,但是明显很多时候需要多个指针管理同一个内存。这个时候shared_ptr就应运而生了。每种智能指针都是以类模板的方式实现的,shared_ptr也不例外。shared_ptr<T>(其中 T表示指针指向的具体数据类型)的定义位于<memory>头文件,并位于 std 命名空间中。所以需要在使用前包含:#include <memory>1、shared_ptr的初始化a. 通过如原创 2021-02-26 16:38:26 · 2435 阅读 · 0 评论 -
Learn C++学习笔记:第M章—最常用的智能指针:std::unique_ptr & std::make_unique
1、基本使用介绍前面已经介绍了很多智能指针了,它就是一个类。这么重要的类当然不需要我们手写,有现成的可以用,它就是:std::unique_ptr①、所在头文件这是一个封装好的类,包含在头文件<memory>中。②、初始化初始的方式也跟正常的类使用一样:std::unique_ptr<YourClass> res{ new YourClass() };③、智能指针之间的复制std::unique_ptr是实现了移动语义的功能的并且禁用复制语义,在智能指针和智能原创 2021-02-24 21:34:41 · 1057 阅读 · 0 评论 -
Learn C++学习笔记:第M章—移动语义和复制语义:为什么移动语义效率更高 & 怎么进行移动std::move
移动语义效率更高前面讲到,之所以采用移动,原因①是为了避免多个智能指针指向同一个内存,导致的释放问题。除了这个优点之外,还有原因②移动语义还比复制语义多一个优点,效率更高。具体来看一个例子:template<class T>class Auto_ptr3{ T* m_ptr;public: Auto_ptr3(T* ptr = nullptr):m_ptr(ptr){} ~Auto_ptr3(){delete m_ptr;} // 复制语义,进行深拷贝,避免重新释放内存原创 2021-02-22 16:08:55 · 575 阅读 · 0 评论 -
Learn C++学习笔记:第M章—智能指针和移动语义
【前言】智能指针和移动语义是迄今为止,最难理解的两个概念。网上查的资料也都解释的要么太高深,要么泛泛为止,反复阅读了好几遍才恍然大悟,领会之后发现其实也没有那么难。智能指针为什么和移动语义有关系智能指针的概念出现其实是非常合理,毕竟有的时候会用new开辟空间,如果这块地址不及时释放,就会造成内存泄漏程序崩溃,所以如果这个指针可以自己在该释放的时候释放,不用人为管理那么多指针,岂不美哉,这就是智能指针。那么移动语义是什么?它和智能指针是啥关系?这个问题的关键就在于,指针可能被用于赋值,传递等,一个智原创 2021-02-18 16:58:05 · 193 阅读 · 0 评论 -
Learn C++学习笔记:第十二章—模板template类和函数的特化(定制)
一、函数模板定制函数模板可以实现对于不同的类型复用同一套代码,但是某些情况下,某些类型需要专门去实现,不能套用模板,举例比如对于数字相加原创 2021-01-09 17:39:48 · 575 阅读 · 0 评论 -
Learn C++学习笔记:第十二章—模板template的使用:模板函数、模板类
template编程是C++中非常重要的技巧,一些常见的stl模板就是用template写的,比如vector等,template是一种非常实用的技巧。因为C++里面的类和函数参数都要求类型,最简单的例子就是对于int、float、double这种类型,假如相同一个比大小的max函数,就得写三个,并且除了类型不一样,代码基本一样,所以一种需求就强烈诞生,把类型抽象出来。除了上面的例子,在使用中一般还有如下扩展:对于类能不能使用template?对于写好的一个模板函数,但是某个类型不适用,需要专门重原创 2020-12-28 18:06:18 · 206 阅读 · 2 评论 -
Learn C++学习笔记:第十二章—动态转换 dynamic_cast
多态允许我们把指向基类的指针可以访问派生类的内容,但是假如我们想访问的派生类中的函数不是重写的基类的虚函数,而是派生类自己的函数呢?上例子更清楚明白一点:#include <iostream>#include <string> class Base{protected: int m_value; public: Base(int value) : m_value(value) { } virtual ~Base() {}}; class De原创 2020-12-12 18:39:35 · 278 阅读 · 0 评论 -
Learn C++学习笔记:第十二章—抽象类、虚基类的定义、用途
抽象类,why?在前面的一直使用的animal例子里,子类需要重写父类的虚函数。那么,假如我子类忘写了,岂不是就报错了。有没有办法,强制子类必须重写虚函数?这就是抽象类的意义。进一步,假如我们写了一个模板接口,继承该模板的子类都重写规定的函数,这就是由抽象类进一步成为接口类。抽象类的定义纯虚函数如果子类都需要重写虚函数,父类的虚函数就不需要定义函数主体了,这时候父类的虚函数就可以是纯虚函数了。定义虚函数只需要给函数加上=0即可。virtual int getValue() const = 0;原创 2020-12-12 17:00:56 · 516 阅读 · 0 评论 -
Learn C++学习笔记:第十二章—虚拟表
12.5 虚拟表这个知识点是面试常问知识点。C++虚函数表剖析这篇文章写得比较清晰易懂。本文基本参考这篇博客和Learn C++。基础概念:类的虚表虚表(虚函数表)是一个指针数组,其元素是虚函数的指针,每个元素对应一个虚函数的函数指针。需要指出的是,普通的函数即非虚函数,其调用并不需要经过虚表,所以虚表的元素并不包括普通函数的函数指针。虚表内的条目,即虚函数指针的赋值发生在编译器的编译阶段,也就是说在代码的编译阶段,虚表就可以构造出来了。每个包含了虚函数的类都包含一个虚表。我们知道,当一个类(原创 2020-12-07 21:47:38 · 270 阅读 · 0 评论 -
Learn C++学习笔记:第十二章—虚函数基础知识:语法、作用、使用情况
12.1 虚函数的作用虚函数是实现C++多态特性的关键功能。引出问题:有一个animal的基类,包含可以打印动物叫声的函数speak()。每种动物的叫声函数speak都不一样,比如派生类cat的speak(),dog的speak()都不一样。如果想打印不同的动物的叫声,则针对每种动物实例化几个具体的对象,然后对每种动物调用speak()函数。问题来了,如果有10种动物呢,30种动物,1...原创 2020-12-01 17:55:14 · 318 阅读 · 0 评论 -
《剑指offer》中涉及C++的基础知识
C++中有哪4个与类型转换相关的关键字?这些关键字各有什么特点,应该在什么场合下使用?答:推荐这篇博客:《【C++】的四种强制转换》讲得浅显一些《C++的四种强制转换》这篇有搭配场景,讲得深一点static_cast:最常用的const_cast:用来转换const类型的,但是尽量不要用,毕竟const就是为了不改变的reinterpret_cast:谨慎使用,用来转换指针的。dynamic_cast:运行时进行的检查。sizeof的使用①定义一个空的类,使用sizeof后得到..原创 2020-08-31 21:31:56 · 364 阅读 · 0 评论 -
vcpkg对Visual studio进行C++的包安装和管理
vcpkg默认安装的是32位版本,所以在vs中使用的时候要注意选择解决方案平台,到底是32还是64。如果要安装64的.\vcpkg.exe install XXXX:x64-windows安装完之后需要推到vs里面,使用:.\vcpkg integrate install主要命令参考这篇文章即可:Visual Studio开源库集成器Vcpkg全教程安装eigen.\vcpkg.exe install eigen3安装opencv主要参考本篇文章window10 visual s原创 2020-07-05 23:04:04 · 1798 阅读 · 0 评论 -
Learn C++学习笔记:第十一章—向派生类中添加功能、多重继承
11.4 派生类添加函数面向对象编程的三大特性:封装、继承和多态。派生类可以继承父类的特性,但是有时候每个派生类都有可能有自己的需求。这个时候就需要继承完往派生类里面添加需要的函数。访问说明符不在类之间进行继承。比如:#include <iostream> class Base{protected: int m_value; public: B...原创 2019-12-30 16:56:46 · 143 阅读 · 0 评论 -
Learn C++学习笔记:第十一章—继承
继承简介C++继承语法非常简单,在class声明之后,我们使用冒号,单词“ public”以及我们希望继承的类的名称。这称为公共继承。#include <iostream> class Base{public: int m_id; Base(int id=0) : m_id(id) { std::cout <...原创 2019-12-27 11:58:42 · 136 阅读 · 0 评论 -
Learn C++学习笔记:第十章—类之间的关系
在面向对象的程序设计中,类之间有6中关系,分别是继承, 组合, 聚合,关联, 依赖,实现。组合(Composition)组合是将一个对象(部分)放到另一个对象里(组合)。它是一种 “has-a” 的关系。相比"聚合",组合是一种强所属关系,组合关系的两个对象往往具有相同的生命周期,被组合的对象是在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁。一般来说被组合对象不能脱离组合对象独立...原创 2019-12-18 15:42:13 · 131 阅读 · 0 评论 -
Learn C++学习笔记:第九章—运算符重载
对于重载运算符,没有太多语法和语言逻辑,知道怎么做,有个模板代码,以后借鉴去改。9.6比较运算符:== != < >这是一段比较==和!=运算符的代码。#include <iostream>#include <string> class Car{private: std::string m_make; std::string m...原创 2019-12-05 11:03:25 · 111 阅读 · 0 评论 -
Learn C++学习笔记:第八章—测试代码运行时间
测试代码运行时间是一个很常用的需求,下面写好了一个模板,直接调用就行:#include <chrono> // for std::chrono functions class Timer{private: // Type aliases to make accessing nested type easier using clock_t = std::chrono::hi...原创 2019-11-26 20:08:56 · 86 阅读 · 0 评论 -
安装pyinstaller封装python代码为exe
安装pyinstaller教程里面一般直接说直接pip install pyinstaller,但是我直接安装时候报如下错误:ERROR: Command errored out with exit status 1通过去GitHub上下载安装包后进行安装:去https://github.com/pyinstaller/pyinstaller下载pyinstaller进入界面"Clon...原创 2019-11-26 20:04:41 · 123 阅读 · 0 评论 -
Learn C++学习笔记:第八章—this指针、const和static的类成员和类函数、friend函数或类
隐藏的this指针现在回想一下类实例的的调用方法,比如:test.func(),返过来思考一下,这个func()函数是怎么被调用的,比如,如果建立类实例的时候,从test的内存里取出func()这个函数,但是实际上这样会导致下图的存储方式:很明显,这会导致函数代码的重复,对于追求效率的C++,这显然是可以优化的地方,并且优化的形式大概也能猜出来,就是合并函数,函数只在创建类的时候存储一次,类...原创 2019-11-26 17:40:58 · 173 阅读 · 0 评论 -
Learn C++学习笔记:第八章— C++中类的基本知识
类和类成员原创 2019-11-12 20:46:07 · 255 阅读 · 0 评论 -
Learn C++学习笔记:第七章— 内联函数、函数重载、函数指针
占个位置原创 2019-10-16 21:10:53 · 164 阅读 · 0 评论 -
Learn C++学习笔记:第七章— 函数参数和通过值、引用和地址传递参数
函数的参数形参:函数声明中表示的变量,比如下面的x。void foo(int x){}实参:函数调用时实际传递到函数的参数,比如下面的y:void foo(int x){}foo(y);将参数传递给函数的主要方法有3种:按值传递,按引用传递和按地址传递。通过值传递函数参数通过值进行传递是最直观方式,示例:#include <iostream> void...原创 2019-10-16 21:09:51 · 167 阅读 · 0 评论 -
Learn C++学习笔记:第六章— void指针、std::vector和std::array
void 指针有void类型的函数,同理,也可以有void类型的指针。void类型的指针可以指向任意类型数据,示例:int nValue;float fValue; struct Something{ int n; float f;}; Something sValue; void *ptr;ptr = &nValue; // okptr =...原创 2019-10-16 09:57:19 · 1249 阅读 · 0 评论 -
Learn C++学习笔记:第六章— 常量指针、引用变量和for-each循环
指向常量的可变指针和常量指针之前介绍的指针都是指向变量的可变指针。但是除了变量还有常量,所以指针的类型也有针对常量的指针。大概可以把指针分为三类:指向变量指针:指针本身指向变量,指针自身也是可变的。指向常量指针:指针可以指向常量也能指向变量,并且指针的指向是可变。指向常量:const int value = 5;const int *ptr = &value;*ptr ...原创 2019-10-15 16:34:52 · 206 阅读 · 0 评论 -
Learn C++学习笔记:第六章—C++的动态内存分配
动态分配内存C ++支持三种基本的内存分配类型:静态内存分配:发生在静态和全局变量中。这些类型的变量的内存在程序运行时分配一次,并在程序的整个生命周期中持续存在。自动分配内存:函数参数和局部变量会自动分配内存。当进入相关的块时,将为这些类型的变量分配内存,并在退出该块时将其释放,并根据需要进行多次。动态内存分配是本文的主题。静态分配和自动分配都有两个共同点:在编译时必须知道变量/...原创 2019-10-14 16:55:44 · 114 阅读 · 0 评论 -
Learn C++学习笔记:第六章—数组、指针和字符串(二)
指针pointers指针是c里面极其重要的概念。变量这些东西是存储在内存里的,所以它们的内存地址就是指针。这也是c语言能够与底层更好的融合、速度更快的原因之一吧。指针定义:数据类型:跟变量一样,需要定义类型,int、float…等,因为按照内存地址找到的只是一堆01,怎么把这些01翻译成想要的东西,这些规则就是数据类型,所以指针也必须定义类型。数据类别除了可以定义指向变量的指针,还能...原创 2019-10-12 15:56:00 · 207 阅读 · 0 评论 -
Learn C++学习笔记:第二章-函数
本学习笔记来源于免费教程https://www.learncpp.com/2.10 预处理器简介2.10.1宏定义#include <iostream> #define MY_NAME "Alex" int main(){ std::cout << "My name is: " << MY_NAME; return 0;}...原创 2019-08-22 11:21:10 · 176 阅读 · 0 评论 -
Learn C++学习笔记:第三章—调试(二)使用IDE调试
3.6 IDE功能:单步调试、step out、step over单步调试 :F11step out :F10step over:Shift + F11单步调试 SteppingIDE一行一行地执行命令,截止2019年8月,IDE不支持后退,如果不小心多执行一步,只能从头开始。因为后退功能需要记录IDE复杂的状态。箭头所指表示IDE将要执行这一行,因为这一行表示调用另外一个函数...原创 2019-08-27 09:42:36 · 324 阅读 · 0 评论 -
Learn C++学习笔记:第四章—C++的基本数据类型
4.1 基本数据类型C++的基本数据类型列表如下:void类型void是最容易解释的数据类型,意味着“没有类型”。有以下两种用途:①没有返回的函数定义:void writeValue(int x) // void here means no return value{ std::cout << "The value of x is: " << x &...原创 2019-08-30 21:40:19 · 415 阅读 · 0 评论 -
Learn C++学习笔记:第五章—运算符
对于运算符,需要了解他们的工作内容,优先级,和顺序。比如+号是从左到右x =((3 + 4)+ 5),=号是从右到左x =(y = z)。运算符的汇总、优先级、作用顺序如下表所示:如果表达式不是特别明显,推荐使用括号来表示他们的先后运算关系...原创 2019-09-03 13:51:26 · 155 阅读 · 0 评论 -
Learn C++学习笔记:第四章—变量的范围、生命周期和链接
块、局部变量的scope、duration在讨论变量时,将范围和持续时间的概念分开是有用的。变量的范围确定变量可访问的位置。变量的持续时间决定了它的创建和销毁位置。这两个概念经常联系在一起。用{.......}括起来的程序块,内部定义的变量,作用范围也仅限本程序块,嵌套程序块可以引用外部块的变量。#include <iostream> int main(){ // 外部块...原创 2019-09-12 14:34:07 · 139 阅读 · 0 评论 -
Learn C++学习笔记:第四章—数据类型的隐式和显式转换
数据类型转换是很可能发生的事情,比如整数和浮点数相加,比如经典的5.1 / 2这种浮点数和整数相除等。数据类型转换主要分为两种:隐式转换和显式转换。隐式转换主要分为两种,一种是扩展转换,比如整数变成浮点数,这种把数据扩展的;另外一种就是压缩转换,比如把浮点数变成整数,这种可能发生数据丢失的。数据扩展转换long l(64); // widen the integer 64 in...原创 2019-09-12 16:08:55 · 171 阅读 · 0 评论 -
Learn C++学习笔记:第四章—常规类型以外的其他数据类型
std :: string数据类型对于char类型,只能定义单个字符。std :: string这是一种字符串类型。使用:先导入相应的库,在进行初始化,初始化必须使用双引号而不能使用单引号。#include <string>std::string myName("anbcd");字符串的输入:使用std :: getline()std::cout只会读取字符串中截止到...原创 2019-09-18 10:24:18 · 134 阅读 · 0 评论 -
Learn C++学习笔记:第五章—程序执行控制流
条件跳转语句 if 和 switchif语句if语句前面介绍过,主要注意点如下:①格式如下:if (expression){ statement}else{ statement2}if语句如果后面不加{}块声明,则只能跟一行语句;②块内定义的变量生命周期只限于块内③可以嵌套:if (expression){ if (expression) { ...原创 2019-09-22 17:04:59 · 115 阅读 · 0 评论 -
Learn C++学习笔记:第六章—数组、指针和字符串(一)
1、数组数组的定义数组是非常常用并且重要的一种数据形式。C++里面关于数组的定义如下:int array[5]与变量的定义接近,只不过后面增加一个表示数组长度的值。①关键字:跟变量接近,可以是int,也可以是float等类型,但是十分有意思的是也可以是结构体类型,示例如下:struct Rectangle{ int length; int width;};Re...原创 2019-10-06 22:58:58 · 181 阅读 · 0 评论 -
Learn C++学习笔记:第三章—调试(一)
3.1 语义和语法错误一般程序的bug分为语法错误和语义错误(逻辑错误)两种,c++里面语法错误比如少一个分号,使用未定义的变量等,但是这类错误比较容易被编译器发现,而逻辑错误有可能编译通过但是运行出错误的结果。所以需要调试,去发现改进语义错误。3.2 调试的过程解决问题的一般思路:找出根本原因理解问题确定解决方案修复问题重新测试3.3-3.4 调试策略找到问题的第一步也是最重要...原创 2019-08-24 13:04:30 · 156 阅读 · 0 评论