普通指针与分享指针
普通指针的操作
解引用:
int ptr = new int{};
*ptr; //解引用
//------------------------
class Test{
public:
int _value;
};
Test* test = new Test{};
test->_value; //间接引用操作符
和pod类型的“拷贝构造函数”,与“赋值构造函数”进行浅拷贝。
还有两个个“自身属性”即指针即为变量内存地址和空指针
分享指针提供我们哪些操作?
分享指针提供给我们与指针相关的操作:
构造上分享指针提供了一些与指针相关的操作:
1,5:即构建新的分享指针,我们可以看到这两个构造函数均被constexpr修饰。
9:是拷贝构造函数(非const)
10:分享指针为我们提供了移动构造函数,这样我们在函数的返回时一般可以直接返回shared_ptr<_type>
分享指针通过重载*
操作符和->
操作符,来模拟指针的解引用。
这两个函数均为const修饰的成员函数,这样我们就可以在const shared_ptr<_type>
下来访问分享指针中所保存的指针成员了。
get函数提供给我们获取存储对象地址的能力,同样它被const所修饰。
以上就是shared_ptr和指针的相同之处,因此分享指针是具有指针一切能力的。所以分享指针可以当作指针用。
那么分享指针与普通指针有哪些不同呢?
分享指针解引用时,返回的对象是无任何修饰符的引用或指针,也就是无论分享指针是否被const修饰的指针修饰其返回值均可调用非const的函数。
那么被const修饰的分享指针不可以进行哪些操作呢。不可以获取所存对象地址,也就是说不能进行get操作,但是如果你强制的获取对象地址也是可以的通过重载的*
的获取存储对象,再通过memory头文件中的addressof<_TY>
来获取存储对象的真正地址,但是这样就违背了分享指针设计的本意了,所以不建议这样做。
因为不能够获取对象地址则我们就不能改变对象的地址,因此赋值构造函数和reset方法是不能够被调用的。
我们要避免这种行为-避免通过已有interface去实现已有interface的功能。
那么分享指针具备哪些普通指针不具备的功能?
7, 针对数组的空指针,或针对特定资源的空指针,提供相应的delete操作,这里的delete指的是“不能被系统自动回收的资源进行回收的操作”,提供相应的资源分配操作。
8,这个比较重要下一节我会单独说。
9,有两个9的原因一个是相同类型一个是针对继承说进行的拷贝构造函数
10, 两个10也是一样,一个是相同类型一个是针对继承说进行的移动构造函数
11,由weak_ptr创建分享指针。不能隐式调用。
12,13,分别由auto_ptr和weak_ptr对share_ptr进行构造。
其他操作:
这里的 owner_before 很重要,也会再下一节记录。