19.C++-(=)赋值操作符、初步编写智能指针

(=)赋值操作符注意事项

首先要判断两个操作数是否相等

返回值一定是 return *this; 返回类型是Type&型,避免连续使用=后,出现bug

比如:

注意:指针对象之间赋值是不会调用(=)复制操作符的

编译器默认提供的类函数

包括了:构造函数,析构函数,拷贝构造函数, (=)赋值操作符

智能指针的由来

在以前C程序里,使用malloc()等函数动态申请堆空间时,若不再需要的内存没有被及时释放,则会出现内存泄漏,若内存泄漏太多,则会直接导致设备停止运行,特别是嵌入式设备,可能有些设备一上电就要运行好几个月.

在C++里,为了减少内存泄漏,所以便引出了智能指针

* ” “ = ”等操作符重载,让这个对象拥有指针的特性.

  • 最后通过析构函数,来释放类里的指针.

一元操作符,也就是说不能带参数

->:

当ptr的类型是普通指针类型时,等价于:(*ptr).mem

当ptr的类型是时,等价于:(ptr.operator->())->value    等价于: ( *(ptr.operator->()) ).value

所以->操作符函数的返回类型是type*,返回值是一个指针变量本身(不带*)

具体参考: https://segmentfault.com/q/1010000004620896

接下来个示例,指向一个int型的智能指针

运行打印:

从结果可以看到, Point p每被从新定义之前,便会自动调用析构函数来释放之前用过的内存,

这样便避免了野指针的出现

接下来,我们继续完善上面代码,使它能够被赋值.

运行打印:

但是,还有个缺点,就是这个智能指针仅仅只能指向int类型,没办法指向其它类型. 

接下来继续修改,通过类模板来使这个智能指针能指向多种类型

运行打印:


文章来源:https://www.cnblogs.com/lifexy/p/8658605.html

原文地址:https://www.cnblogs.com/xiongjim/p/9673932.html