shellmad C++新特性
文章平均质量分 78
shellmad C++新特性
打雷要下雨,雷欧
这个作者很懒,什么都没留下…
展开
-
shellmad-25_C++新特性 强弱指针计数器增减分析
这节课讲讲智能指针的计数器如何去管理的以及我们自己来编写一个自己的有强弱指针关系的智能指针版本具体而言:按道理, 我们要跟踪源码, 为什么呢因为我们要知道几个问题何时我们的强指针次数会+1, 何时我们的弱指针次数会+1我们需要去跟踪这里我们提供跟踪的思路强指针构造, 析构, =赋值, 拷贝构造等情况下, 计数器的变化弱指针构造, 析构, =赋值, 拷贝构造等情况下, 计数器的变化弱指针提升为强指针, 计数器变化代码运行分析:强指针构造的时候, 计数器变化情况单步走, f5,原创 2021-03-22 12:25:56 · 199 阅读 · 0 评论 -
shellmad-24_C++新特性 share_ptr与weak_ptr的源码分析
深入分析shared_ptr与weak_ptr的实现stl中使用了shared_ptr来管理一个对象的内部指针,并且使用了weak_ptr来防止前面所提到的shared_ptr循环引用的问题。接下来简单的分析shared_ptr和weak_ptr的实现,最后通过自己写代码来模拟shared_ptr和weak_ptr,达到深入学习的目的:测试代码如下:#include "stdafx.h"#include <memory>int _tmain(int argc, _TCHAR* ar原创 2021-03-22 11:15:09 · 225 阅读 · 1 评论 -
shellmad-23_C++新特性 weak_ptr的提出及解决循环引用的思路
深入分析shared_ptr与weak_ptr的实现stl中使用了shared_ptr来管理一个对象的内部指针,并且使用了weak_ptr来防止前面所提到的shared_ptr循环引用的问题。接下来简单的分析shared_ptr和weak_ptr的实现,最后通过自己写代码来模拟shared_ptr和weak_ptr,达到深入学习的目的:测试代码如下:#include "stdafx.h"#include <memory>int _tmain(int argc, _TCHAR* ar原创 2021-03-22 08:49:15 · 151 阅读 · 0 评论 -
shellmad-22_C++新特性 智能指针循环引用问题原理解析
智能指针的循环引用// TestC11.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>#include <cstring>using namespace std;//智能指针:// 1. 用起来像指针// 2. 会自己对资源进行释放class CStudent{public: CStudent() {} void test() { cout &l原创 2021-03-22 08:20:46 · 113 阅读 · 0 评论 -
右值引用_自己总结
普通对象 右值引用来接收减小内存消耗#include <iostream>using namespace std;int g_constructCount=0;int g_copyConstructCount=0;int g_destructCount=0;struct A{ A(){ cout<<"construct: "<<++g_constructCount<<endl; } A原创 2021-03-17 10:17:50 · 145 阅读 · 0 评论 -
shellmad-右值引用
七大爷的备课的内容, 转载过来右值引用右值引用是 C++11 引入的与 Lambda 表达式齐名的重要特性之一。它的引入解决了 C++ 中大量的历史遗留问题,消除了诸如 std::vector、std::string 之类的额外开销,也才使得函数对象容器 std::function 成为了可能。(1)左值、右值的纯右值、将亡值、右值要弄明白右值引用到底是怎么一回事,必须要对左值和右值做一个明确的理解。左值(lvalue, left value),顾名思义就是赋值符号左边的值。准确来说,左值是表达式转载 2021-03-17 08:59:21 · 145 阅读 · 0 评论 -
shellmad-21_C++新特性 shared_ptr与weak_ptr
本文内容大部分来自七大爷的备课笔记七大爷的视频shared_ptr与weak_ptrshared_ptr是带引用计数的智能指针:1. 构造其初始化多了一种写法:std::make_sharedvoid foo_construct(){ int* p = new int(3); std::shared_ptr<int> sptr(p); std::shared_ptr<int> sptr2(new int(4)); std::shared原创 2021-03-13 23:23:41 · 136 阅读 · 0 评论 -
shellmad-20_C++新特性 unique_ptr的使用
unique_ptr前面我们讲解了auto_ptr的使用及为什么会被C++11标准抛弃,接下来,我们来学习unique_ptr的使用:unique_ptr提供了以下操作:看起来似乎与auto_ptr相似,但是其实有区别。1. 构造函数虽然这里的构造函数比较多,但是可以发现,实际上是没有类似auto_ptr的那种拷贝构造:void foo_constuct(){ //这样构造是可以的 std::unique_ptr<int> p(new int(3)); /原创 2021-03-11 21:00:46 · 187 阅读 · 0 评论 -
shellmad-19_C++新特性 auto_ptr的使用及废除原因
auto_ptr (C++11 中弃用)auto_ptr (C++17 中移除)先来看看auto_ptr的缺点, 然后理解为什么需要被删除, 然后我们有的放矢, 将缺点修复以下, 才能更加理解后面的知识从官网的文档上就可以看出,这个auto_ptr指针不推荐使用(deprecated),原因这里也有说明:Note: This class template is deprecated as of C++11. unique_ptr is a new facility with a similar f原创 2021-03-11 20:13:56 · 699 阅读 · 0 评论 -
shellmad-18_C++新特性 智能指针的简易实现及添加模板
前面提到可以用引用计数 + 写时拷贝 融合在一起, 为我们的智能指针增加新的功能代码增加了CRefCount类, 来专门对CStudent*类的对象的使用情况做统计类很简单, 构造的时候, 计数器赋值为1析构的时候, 把它删掉增加引用的时候会+1当计数器减少为0的时候, 会释放掉delete this;这么写, 就一定要保证自己是一个堆对象class CRefCount{ friend class CSmartPtr; CRefCount(CStudent* pStu) {原创 2021-03-10 23:25:57 · 214 阅读 · 0 评论 -
shellmad-17_C++新特性 智能指针的原理
简单的介绍到底什么是智能指针智能指针:用起来像指针(注意, 这里用了“像”)会自己对资源进行释放自己对资源进行释放先来写一个简单的例子class CStudent{public: CStudent() { } void test() { cout << "CStudent" << endl; } private: char* m_pszBuf; int m_nSex;};所谓的智能指针是要解决什么问题原创 2021-03-10 23:04:50 · 217 阅读 · 0 评论 -
shellmad-16_C++新特性 写时拷贝
上节课引用技术遗留了两个问题当我们资源进行修改, 所有引用该对象的资源都会被修改.解决该问题的思路: 写时拷贝(Copy On Write) : 在写的时候, 对资源进行重新拷贝一份, 当某个资源要进行修改的时候, 我们C++检测到这种修改, 然后会对这个资源进行一次拷贝, 接下来你的修改与原资源没有关系了, 因为你改变的是拷贝的值, 所以如果这么做, 能够解决上述问题但是如果这么做, 要对引用技术进行相应的加减, 新的资源, 要有新的引用计数器, 要新产生,并且变为1; 原始的资源的引用计数要-原创 2021-03-10 21:33:50 · 125 阅读 · 0 评论 -
shellmad-15_C++新特性 引用计数
为了正确的理解智能指针, 我们需要了解引用计数深拷贝深拷贝: 当一个对象内部有某种资源的时候, 指针, 文件指针等资源. 当我们对资源进行复制的时候, 我们需要写一个拷贝构造函数.拷贝构造函数函数需要对内容进行重新的复制优点: 每一个对象的指针指向独立的内存, 不是共享的, 对象在析构的时候会释放资源, 不存在重复释放, 内存泄漏的问题缺点:内存开销大浅拷贝浅拷贝: 不许啊哟这么做, 值传递通过拷贝构造函数实例化对象的时候, 没有对资源进行复制, 仍然共享某个资源优点:内存考校小缺点:重原创 2021-03-10 21:04:38 · 138 阅读 · 0 评论 -
shellmad-10_C++新特性 lambda表达式与匿名函数
代码中会遇到这样一种情况, 写的某一个函数, 有可能只会被调用1次, 或者说不会在被其他地方复用了, 这时候专门写一个函数就不太划算, 但是不写的话, 代码逻辑就会比较混乱, 所以就有一个匿名函数的东西举个例子比如点击某个按钮, 会执行某个动作那么在执行动作的时候, 对应的是某个函数的处理而实际上动作只是针对于这个点击操作而言的, 才触发的在其他地方都不会被使用到的, 只有在这里被使用的, 所以最好的方式是为他提供一个匿名函数lambda表达式就是匿名函数(没有名字的函数)一般函数写法原创 2021-03-17 08:12:44 · 209 阅读 · 0 评论 -
shellmad-09_C++新特性 强制转换reinterpret_cast
reinterpret_cast等价于C语言中的类型转换int main(){ int n = 1; int* p = n; }按道理, 应该无法转换然后强制转换, 解决问题int main(){ // 显式强转 int n = 1; int* p = (int*)n; }C++为了统一, 也还是创建了一个转换方式, 来替换强转跟显示的强转, 没有任何区别, 只是看起来更加的清晰而已, 可读性更好用于高风险的转换方式整形转指针各种类型的指针转换父类, 子类指针的转换原创 2021-03-14 12:41:50 · 95 阅读 · 0 评论 -
shellmad-08_C++新特性 强制转换dynamic_cast
dynamic_cast用于具有虚函数的基类与派生类之间的指针或引用的转换。基类必须具备虚函数原因:dynamic_cast是运行时类型检查,需要运行时类型信息(RTTI),而这个信息是存储与类的虚函数表关系紧密,只有一个类定义了虚函数,才会有虚函数表。运行时检查,转型不成功则返回一个空指针非必要不要使用dynamic_cast,有额外的函数开销常见的转换方式:基类指针或引用转派生类指针(必须使用dynamic_cast)派生类指针或引用转基类指针(可以使用dynam原创 2021-03-14 12:27:15 · 432 阅读 · 0 评论 -
shellmad-07_C++新特性 强制转换static_cast
C语言中存在隐式类型转换#include <iostream>using namespace std;int main(){ int n = 5; flaot f = 10.0f; f = n; return 0;}但是这样写, 给程序员带来烦恼, 因为看到f = n的时候, 需要判断是否发生了隐式类型转换static_cast将这种转换明确一下, 说明隐式类型转换...int main(){ int n = 5; float f = 10.0f; f = st原创 2021-03-13 22:55:50 · 126 阅读 · 2 评论 -
shellmad-06_C++新特性 强制转换const_cast
类型转换以下程序编译不通过, 因为相当于将整形n当成地址赋给指针#include <iostream>using namespace std;int main(){ int n = 1; int *p = n; return 0;}但是C语言类型可以强转, 可以编译通过, 也可以正常运行#include <iostream>using namespace std;int main(){ int n = 1; int *p原创 2021-03-13 12:31:21 · 302 阅读 · 0 评论