【C++】STL中shared_ptr和weak_ptr
一、shared_ptr的内存结构 结构解释: _Ptr和_Ref分别保存存放在堆区空间的被管理对象和引用计数结构 引用计数结构中的_rptr也保存被管理对象的地址。 _Users记录shared_ptr指针管理对象的个数 _Weaks记录weak_ptr管理对象的个数 二、删除器1234567891011121314151617181920212223242526272829//单个对象删除器template<class _Ty>class Deleter{ Deleter() = default;public: void operator()(_Ty* p = NULL)const { if (p != NULL) { delete p; } }};//一组对象删除器template<class _Ty>class Deleter<_Ty[]>{ Deleter() = default;public: void operator()(_Ty* p = NULL) ...
【C++】STL中shared_ptr仿写一
一、关于shared_ptr定义于头文件 12template< class T > class shared_ptr;//(C++11 起) std::shared_ptr 是通过指针保持对象共享所有权的智能指针。多个 shared_ptr 对象可占有同一对象。下列情况之一出现时销毁对象并解分配其内存: 最后剩下的占有对象的 shared_ptr 被销毁; 最后剩下的占有对象的 shared_ptr 被通过 operator= 或 reset() 赋值为另一指针。 二、shared_ptr对象内存结构 三、仿写代码shared_ptr 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 ...
【设计模式】工厂模式
一、工厂模式工厂模式是对简单工厂模式的优化,以汽车为例,工厂模式有以下角色 抽象工厂类:抽象汽车工厂 具体工厂类:轿车工厂类、公交工厂类 抽象产品类:汽车产品类 具体产品类:汽车、公交 各类关系图: 二、工厂模式的实现Factory.h123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#ifndef FACTORY_H#define FACTORY_H#include <iostream>#include <string>using namespace std;//抽象产品类class Products{public: //产品方法 virtual void productMethod() = 0;};//car产品类class car : public Products{public: void productMethod() { ...
【设计模式】简单工厂模式
一、简单工厂模式以汽车厂生产为例子: 工厂角色:(汽车厂)一个静态公有成员方法负责生产符合要求的产品; 抽象产品:是一个抽象类,其派生类有各种各样的产品; 具体产品:汽车car、公交车bus 对应的代码:SimpleFactory.h1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253#ifndef SIMPLEFACTORY_H#define SIMPLEFACTORY_H#include <iostream>#include <string>using namespace std;//抽象产品类class Products{public: virtual void product() = 0;};//具体产品class car : public Products{public: virtual void product() { cout << "cr ...
【C++】unique_ptr问题补充
关于使用unique_ptr作为函数返回值(1)写法123456789101112131415#include<iostream>#include<memory>using namespace std;unique_ptr<int> fun(int x){ unique_ptr<int> tmp(new int(x)); return tmp;}int main(){ int a = 10; unique_ptr<int> ptr = fun(a); cout << *ptr << endl; return 0;} 分析:众所周知,unique_ptr中已经将拷贝构造和赋值构造函数删除了,那为什么这个fun在返回tmp没有报错呢?原因在于:值类型返回时,tmp将采用移动构造存储在临时对象空间中,将临时空间对象再使用移动赋值转移资源给ptr对象,所以并未报错,并且十分合理。 (2)写法1234567891011unique_ptr<int> fun( ...
【C++】STL中unique_ptr
一、关于unique_ptrC++11标准引入唯一性智能指针unique_ptr,是通过指针占有并管理另一对象(new申请),并在unique_ptr离开作用域时自动释放该对象的智能指针。定义于头文件 单对象一般版本: 12template<class T, class Deleter = std::default_delete<T>> class unique_ptr; 数组特化版本 12template <class T, class Deleter> class unique_ptr<T[], Deleter>; 注:Deleter是删除器类型 二、相关解释 删除了拷贝构造、赋值重载 保留移动构造、移动赋值 unique_ptr 可以不占有对象,该情况下称它为空。 三、使用场景 四、unique_ptr仿写代码: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 ...
【C++】STL中被弃用的auto_ptr
一、关于auto_ptrC++11标准前STL中就有了auto_ptr, 是通过由 new 表达式获得的对象,并在 auto_ptr 自身被销毁时删除该对象的智能指针。它可用于为动态分配的对象提供异常安全、传递动态分配对象的所有权给函数和从函数返回动态分配的对象。 二、实现auto_ptr代码: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091#include<iostream>using namespace std;namespace pzj{ template<class _Ty> class auto_ptr { private: _Ty* _P; //new的对象的地址 bool owns; //拥有权(_P为NULL为假,反之) ...
【C++】菱形继承和虚继承
一、菱形继承菱形继承结构: 菱形继承在现实中是存在的,例如人、学生、研究生、在职研究生的关系就是属于菱形继承。 但是明显看出普通的菱形继承结构出现了数据冗余,而虚继承就是解决菱形继承带来的数据冗余问题。 二、虚继承语法:class 派生类 :virtual 继承权限 基类;菱形继承代码: 1234567891011121314151617181920212223class Base{private: int top;};class Son1 : virtual Base{private: int first;};class Son2 : virtual Base{private: int second;};class Grandson : public Son1, public Son2{private: int low;}; 虚继承解决数据冗余后的内存结构:
【C++】类模板继承问题
一、情况一12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152#include<iostream>using namespace std;template<class _Ty>class Base{private: _Ty val;public: Base(_Ty x = _Ty()): val(x) { }public: static int num;};template<class _Ty>int Base<_Ty>::num = 0;class Son1 : public Base<int>{public: Son1(): Base() { num +=1; } void PrintNum()const { cout << num << endl; }};c ...
【C++】完美转发
完美转发(perfect forwarding) 是指函数模板在向其他函数传递参数时该如何保留该参数的左右值属性的问题。 也就是说函数模板在向其他函数传递自身形参时,如果相应实参是左值,它就应该被转发为左值;同样如果相应实参是右值,它就应该被转发为右值。 这样做是为了保留在其他函数针对转发而来的参数的左右值属性进行不同处理(比如参数为左值时实施拷贝语义;参数为右值时实施移动语义)的可能性。 如果将自身参数不分左右值一律转发为左值,其他函数就只能将转发而来的参数视为左值,从而失去针对该参数的左右值属性进行不同处理的可能性。 一个完美转发的例子 1234567891011121314151617181920212223242526#include <iostream>using namespace std; void fun(int &x) { cout << "lvalue ref" << endl; }void fun(int &&x) { cout << &qu ...