智能指针
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()
返回计数器的个数
使用智能指针的三种情况
- 程序不知道自己需要使用多少对象
- 程序不知道所需对象的准确类型
- 程序需要在多个对象间共享数据
常成员函数
成员函数后面加上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
是个好东西!