智能指针

shared_ptr 允许多个指针指向同一个对象

weak_ptr 弱引用,指向shared_ptr 所管理的对象

unique_ptr 独占所指向的对象

内存分配

make_shared 最安全的分配和使用动态内存的方法

shared_ptr<string> p=make_shared<string>("hello shared_ptr p!");//调用类型T的构造函数
auto q=make_shared<string>("hello shared_ptr q!"); //使用auto可以简写类型

reset

shared_ptr<int> p;
p.reset(new int);

对于unique_ptr 来说,初始化只能用new

unique_ptr<int> p(new int);
unique_ptr<int> q;
q.reset(new int);

对于weak_ptr 来说,初始化只能用shared_ptr

unique_ptr<int> p(new int);
weak_ptr<int> q(p); //weak_ptr不会增加shared_ptr的计数器次数
//使用之前,需要通过lock()来判断,指向对象是否存在,才可以继续使用
// lock()返回一个shared_ptr指针,如果指针为空,就说明,其指向的对象已经被析构了
if(auto tpm=q.lock()) 
{
   
    //
}

计数器

  每一个shared_ptr都有一个关联的计数器,当我们拷贝一次指针的时候,相当指向对象的指针多了一个,因此,计数器会+1,当我们销毁一个指针的时候,计数器会-1,最终,指向内存区域的指针数为0的时候,这块内存会被自动释放掉(最后一个指针的析构函数,会帮助做这些事情)

   当我们的智能指针是局部变量的时候(例如在一个函数的内部),当函数退出的时候,指针会被销毁,自然,其管理的对象也会被释放掉

p.unique() 判断p的计数器是否是1

p.use_count() 返回计数器的个数

使用智能指针的三种情况

  1. 程序不知道自己需要使用多少对象
  2. 程序不知道所需对象的准确类型
  3. 程序需要在多个对象间共享数据

常成员函数

  成员函数后面加上const,表示该函数是常成员函数,只有常成员函数才有资格操作常量或常对象,没有使用const关键字说明的成员函数不能用来操作常对象。

#include<iostream>
using namespace std;
class A
{
   
public:
    void print() const {
   cout<<"print! const"<<endl;}
    void print()  {
   cout<<"print! "<<endl;}

};
int main()
{
   
    const A a;
    a.print();//调用print() const
    A b;
    b.print();//调用print()
    return 0;
}

  当然,常成员函数也可以被普通对象调用,当我们只保留print() const的时候,b.print()也会输出print! const

const int* p 、int* const p

const int* p; // 指向常量的指针,本身可以更换指向的对象
int* const q; // 常量指针,其指向的对象的值可以改变
const int* const r; //指向常量的常量指针,本身不可以更换指向的对象,且指向的对象的值不可改变

在vscode里面配置两个快捷键
Ctrl+Delete 删除光标右边的一行
Ctrl+BackSpace
markdown
Ctrl+/ 来回切换源码模式,适合从Typora往其他地方粘贴时

不得不说,Ctrl 是个好东西!