智能指针的实现(指针运算符重载)

摘要:
使用namespacestd;Person(){}Person(inta){this->}~ Person(cout<“解构的人”<(){returnthis->//返回人指针}//重载*Person&运算符*(){return*this->//返回人的本体,因此返回*this->

智能指针的实现

Person类有showAge 成员函数

如果new出来的Person对象,就要让程序员自觉的去释放  delete

有了智能指针,让智能指针托管这个Person对象,对象的释放就不用操心了,让智能指针管理

为了让智能指针想普通的Person*指针一样使用 就要重载 -> 和*

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;

class Person
{
public:
    Person(){}
    Person(int a)
    {
        this->m_Age = a;
    }
    void showAge()
    {
        cout << "Person的年龄是:" << this->m_Age << endl;
    }

    ~Person()
    {
        cout << "析构了Person" << endl;
    }
    int m_Age;
};

//智能指针
//用来托管自定义类型的对象,让对象进行自动的释放
class smartPointer
{
public:
    smartPointer(Person* person)
    {
        this->person = person;
    }

    //重载->让智能指针对象 像Person *p一样去使用
    Person* operator->()
    {
        return  this->person; //返回person指针
    }
    //重载* 
    Person& operator*()
    {
        return *this->person; //要返回的是person的本体 所以return * this->person
    }

    ~smartPointer()
    {
        cout << "析构了智能指针" << endl;
        if (this->person != NULL)
        {
            delete this->person;        //删除Person对象的指针
            this->person = NULL;        //防止野指针
        }
    }

    Person * person;    //维护Person指针
};

void test()
{
    //Person* p = new Person(100); //如果忘记释放,那么就会造成内存泄漏
    smartPointer sp(new Person(10));    //开辟到了栈上,调用完毕会自动释放 调用析构
    //smartPointer* sp = new smartPointer(new Person(10)); //开辟在堆区 不会自动释放
    sp->showAge();          //因为重载了->  所以sp->返回的是person的指针,正常应该是sp->->showAge() 才会调用Person的showAge方法
                            //编译器优化了 把->->减少一个箭头 即->
    (*sp).showAge();
}

int main()
{
    test();
    system("Pause");
    return 0;
}

免责声明:文章转载自《智能指针的实现(指针运算符重载)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇12-01 Java Scanner类,Scanner类中的nextLine()产生的换行符问题springAOP实现操作日志记录,并记录请求参数与编辑前后字段的具体改变下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

原生JS实现双向链表

1.前言 双向链表和单向链表的区别在于,在链表中,一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素,另一个链向前一个元素,如下图所示: 从图中可以看到,双向链表中,在每个节点Node里有prev属性(指向上一个节点的指针)和next属性(指向下一个节点的指针),并且在链表中也有head属性(用来存储链表第一项的引用)和ta...

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?> <!-- CacheManager Configuration ========================== An ehcache.xml corresponds to a single CacheManager. See instructions...

Linux 后台运行python .sh等程序,以及查看和关闭后台运行程序操作

1、运行.sh文件 直接用./sh 文件就可以运行,但是如果想后台运行,即使关闭当前的终端也可以运行的话,需要nohup命令和&命令。 (1)&命令 功能:加在一个命令的最后,可以把这个命令放在后台执行   (2)nohup命令 功能:不挂断的运行命令   2、查看当前后台运行的命令 有两个命令可以用,jobs和p...

epoll 应用

/*  * test_bittube.cpp  *  *  Created on: 2015年7月13日  *      Author: ting.guit  */ #include <binder/IPCThreadState.h> #include <binder/ProcessState.h> #include <b...

32位程序调用64位函数————开源代码rewolf-wow64ext学习笔记

rewolf-wow64ext的目的就是让运行在Wow64环境中的x86应用程序可以直接调用x64下ntdll.dll中的Native API。   学习中可以得到几个结论 在X64环境下的进程,32位程序,映射了两个地址空间,一个32位,一个64位。而且这两种工作模式是可以切换的的。 WOW64进程中的R12寄存器指向其64位的TEB结构(线程环境块...

yii2的csrf验证原理分析及token缓存解决方案

本文主要分三个部分,首先简单介绍csrf,接着对照源码重点分析一下yii框架的验证原理,最后针对页面缓存导致的token被缓存提出一种可行的方案。涉及的知识点会作为附录附于文末。 1.CSRF描述 CSRF全称为“Cross-Site Request Forgery”,是在用户合法的SESSION内发起的攻击。黑客通过在网页中嵌入Web恶意请求代码,并诱使...