文章目录

  • 1 C++中的指针特征操作符重载
    • 1.1 指针特征操作符重载
    • 1.2 使用指针特征操作符重载实现智能指针

1 C++中的指针特征操作符重载

1.1 指针特征操作符重载

指针特征操作符重载:

  • 可以重载指针特征操作符(->和*)。
  • 只能通过类对的成员函数重载。
  • 重载函数不能使用参数。
  • 只能定义一个重载函数。
  • 重载指针特征符能够使用对象代替指针。

1.2 使用指针特征操作符重载实现智能指针

内存泄漏(臭名昭著的bug):

  • 动态申请堆空间,用完不归还。
  • C++语言没有垃圾回收的机制。
  • 指针无法控制所指堆空间的生命周期。

我们需要什么:

  • 需要一个特殊指针。
  • 指针生命周期结束时主动释放堆空间。
  • 一片堆空间最多只能由一个指针标识。
  • 杜绝指针运算和指针比较。

智能指针的使用军规:只能用来指向堆空间中的对象或者变量。智能指针的意义在于最大程度的避免内存问题。

智能指针的实现:

#include <iostream>
#include <string>using namespace std;class Test
{int i;
public:Test(int i){cout << "Test(int i)" << endl;this->i = i;}int value(){return i;}~Test(){cout << "~Test()" << endl;}
};class Pointer
{Test* mp;
public:Pointer(Test* p = NULL){mp = p;}Pointer(const Pointer& obj){mp = obj.mp;const_cast<Pointer&>(obj).mp = NULL;}Pointer& operator = (const Pointer& obj){if( this != &obj ){delete mp;mp = obj.mp;const_cast<Pointer&>(obj).mp = NULL;}return *this;}Test* operator -> (){return mp;}Test& operator * (){return *mp;}bool isNull(){return (mp == NULL);}~Pointer(){delete mp;}
};int main()
{Pointer p1 = new Test(0);cout << p1->value() << endl;Pointer p2 = p1;cout << p1.isNull() << endl;cout << p2->value() << endl;return 0;
}

参考资料:

  1. C++深度解析教程

C++中的指针特征操作符重载相关推荐

  1. 【Groovy】集合遍历 ( 操作符重载 | 集合中的 “ << “ 操作符重载 | 使用集合中的 “ << “ 操作符添加一个元素 | 使用集合中的 “ << “ 操作符添加一个集合 )

    文章目录 一.集合中的 " << " 操作符重载 1.使用集合中的 " << " 操作符添加一个元素 2.使用集合中的 " & ...

  2. c++操作符重载,拷贝构造函数和友…

    操作符重载 把c++的操作符在自己的新函数中重新实现就是操作符重载. 可以在类里面以成员函数的方式重载某个操作符,也可以在某个名字空间中重载操作符. ------------------------- ...

  3. Kotlin 操作符重载详解

    本文主要内容 算术操作符重载 二元操作符重载 复合赋值操作符重载 一元操作符重载 比较操作符重载 集合相关的操作符重载 索引操作符重载 索引操作符重载Kotlin集合中的应用 in 操作符重载 区间操 ...

  4. 【Groovy】集合遍历 ( 操作符重载 | 集合中的 “ + “ 操作符重载 | 集合中的 “ - “ 操作符重载 | 代码示例 )

    文章目录 一.集合中的 " + " 操作符重载 二.集合中的 " - " 操作符重载 三.完整代码示例 一.集合中的 " + " 操作符重载 ...

  5. C++中逗号操作符重载的分析

    1,关注逗号操作符重载后带来的变化: 2,逗号操作符: 1,逗号操作符(,)可以构成都好表达式:exp1, exp2, exp3, ..., expN 1,逗号表达式用于将多个表达式连接为一个表达式: ...

  6. C++中的new和delete操作符重载

    文章目录 1 new和delete操作符重载 1.1 new和delete操作符重载简介 1.2 静态存储区中创建动态对象 1.3 在指定的地址上创建C++对象 2 new[]和delete[]操作符 ...

  7. C++中的逻辑操作符重载

    文章目录 1 C++中的逻辑操作符重载 1.1 逻辑操作符的原生语义 1.2 重载逻辑操作符 1.3 逻辑操作符重载的建议 1 C++中的逻辑操作符重载 1.1 逻辑操作符的原生语义 逻辑操作符的原生 ...

  8. C++中的赋值操作符重载

    文章目录 1 C++中的赋值操作符重载 1.1 赋值操作符重载 1 C++中的赋值操作符重载 1.1 赋值操作符重载 关于赋值操作符: 编译器为每个类默认重载了赋值操作符. 默认的赋值操作符仅完成浅拷 ...

  9. Python中的操作符重载

    类可以重载python的操作符 操作符重载使我们的对象与内置的一样.__X__的名字的方法是特殊的挂钩(hook),python通过这 种特殊的命名来拦截操作符,以实现重载. python在计算操作符 ...

最新文章

  1. python数据写入CSV
  2. java list 去重 相同的相加_Java 中的数据流和函数式编程 | Linux 中国
  3. 10.利用STM32定时器的PWM输出功能,直接获取PWM波形。
  4. WEB BUTTON IN DOTNET
  5. 阿里巴巴大规模稀疏模型训练/预测引擎 DeepRec 正式开源
  6. 温故知新----css盒模型
  7. Aerial为苹果而生,一款炫酷的Mac屏幕保护程序
  8. 班级随机点名html,提问之星随机点名随机抽取班级学生教程
  9. 应运而生的教学工具——《爱上micro:bit》读书笔记
  10. 什么是瀑布图_什么是瀑布图以及为什么我需要一个
  11. 机器学习练习 6 - Support Vector Machines(支持向量机)
  12. 2021qq匿名说说在哪里
  13. 用matlab实现电影推荐性能测试,优化标准测试函数及MATLAB代码
  14. 1602LCD主要技术参数
  15. 游戏 找CALL技巧 突破口
  16. [安洵杯 2019]Attack (详细解析)
  17. u大师u盘装系统win7_小U讲解刀客电脑u盘重装系统win7_Win7 教程
  18. 深度学习——Noisier2Noise
  19. java去除字符串中最后一个字符_java中字符串如何去除最后一个字符方法
  20. 金融科技之:农业供应链金融系统平台建设方案分享

热门文章

  1. mysql -u -p -d_mysqld_exporter监控mysql
  2. 一起学nRF51xx 13 - twi iic
  3. LTE的随机接入过程解析
  4. 那些年我们一起玩DIY总结出的经验——网络篇
  5. 【DIY】送给儿子的感应小夜灯,DIY小夜灯,无需编程,用人体红外感应传感器制作小夜灯...
  6. 【更新】北京、广东、吉林重名数量查询工具,给孩子起名重名查询
  7. 基于小波和插值的超分辨率图像重建算法
  8. 5.MATLAB路径管理
  9. java8新特性-lambda表达式和stream API的简单使用
  10. 【bzoj5427】最长上升子序列(贪心+LIS)