C++11新特性(41)- 智能指针shared_ptr(3)

初始化(构造函数)之后,今天继续说明赋值(赋值运算符)。在实现时构造函数和赋值运算符的区别很明显,一个是构造函数,一个是运算符重载。但是在使用时有时还是不大好区分,例如一个赋值表达式有时也会调用构造函数等。

本文的内容还是来自下面的网站:
http://www.cplusplus.com/reference/memory/shared_ptr/operator=/

拷贝赋值


函数原型:
shared_ptr& operator= (const shared_ptr& x) noexcept;

说明:
从已有指针赋值给shared_ptr,共享数据管理权。

代码实例:


执行结果:

从输出结果可以看到ps和ps1计数,指针的取值。

注意事项:
ps1的声明和赋值是分两次进行的,只有这样才会执行赋值操作。下面的代码看起来虽然是赋值,但实际执行的是初始化操作(构造函数)。



移动赋值


函数原型:
shared_ptr& operator= (shared_ptr&& x) noexcept;

说明:
从已有指针赋值给shared_ptr,伴随数据管理权的转移。移动赋值和拷贝赋值的区别在于参数是否为右值引用。

代码实例:

执行结果:

从输出结果可以看到ps和ps1计数,指针的取值。

注意事项:
虽然拷贝赋值也不会导致内存泄漏,但是某些场景下,移动赋值可以更加准确的反映编程者的意图,可能更早的释放内存。

下面的代码执行的也是移动赋值。



作者观点

做正确的事情,不需要理由。


觉得本文有帮助?请分享给更多人。

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】



猜你喜欢

转载自blog.csdn.net/craftsman1970/article/details/80806877