【C++练习题】实现智能指针

举报
王建峰 发表于 2021/11/19 00:08:02 2021/11/19
【摘要】   两种创建类实例的方法 Person p1(10); //对象创建在栈空间,值引用,系统自动析构 Person * p1 = new Person(10); //对象创建在堆空间,指针访问,需要程序员delete调用析构p1->showAge();delete p1; 那么,有没有一种让对象分...

 

两种创建类实例的方法


  
  1. Person p1(10); //对象创建在栈空间,值引用,系统自动析构
  2. Person * p1 = new Person(10); //对象创建在堆空间,指针访问,需要程序员delete调用析构
  3. p1->showAge();
  4. delete p1;

那么,有没有一种让对象分配在堆内存空间,使用指针的方式访问,但又不用程序员手动delete堆空间的实现呢???

 

智能指针

定义:用来托管自定义类型的对象,让对象进行自动的释放。

功能:既能让对象分配在堆内存空间,使用指针的方式访问,又不用程序员手动delete堆空间(系统实现)。

 

分析:设计一个smartPointer类,smartPointer类的指针成员来访问管理我所要管理的对象。这样管理的对象可以分配在堆空间(使用new创建),而smartPointer类的实例确是在栈上创建的,在smartPointer类的析构中实现管理对象的delete,这样就实现了系统自动delete对象了;进一步在smartPointer类重载 '*' '->'运算符,可以像指针一样访问我要管理的对象,为智能指针。

我的码云:https://gitee.com/hinzer/my-notes-of-C_plus/tree/master/step8/smartPointer

 

智能指针创建步骤

1.定义指针成员,用来管理目标对象;
2.构造函数中,初始化指针成员;
3.析构函数中delete处理目标对象;
4.分别实现'->' '*'运算符的重载;

 

代码实现


  
  1. #include<iostream>
  2. using namespace std;
  3. class Person
  4. {
  5. public:
  6. Person(int age)
  7. {
  8. this->m_Age = age;
  9. }
  10. void showAge()
  11. {
  12. cout << "年龄为:" << this->m_Age << endl;
  13. }
  14. ~Person()
  15. {
  16. cout << "Person的析构调用" << endl;
  17. }
  18. int m_Age;
  19. };
  20. class smartPointer
  21. {
  22. public:
  23. smartPointer(Person * person)
  24. {//2.person指针初始化
  25. this->person = person;
  26. }
  27. Person * operator->()
  28. {//3.重载->让智能指针对象 想Person *p一样去使用
  29. return this->person;
  30. }
  31. Person& operator*()
  32. {//3.重载 *
  33. return *this->person;
  34. }
  35. ~smartPointer()
  36. {//2.释放目标对象所在的堆空间
  37. cout << "智能指针析构了" << endl;
  38. if (this->person !=NULL)
  39. {
  40. delete this->person;
  41. this->person = NULL;
  42. }
  43. }
  44. private:
  45. Person * person; //1.创建指针成员(访问堆内存)
  46. };
  47. void test01()
  48. {
  49. //Person p1(10); //对象创建在栈空间,系统自动析构
  50. //Person * p1 = new Person(10); //对象创建在堆空间,需要程序员delete调用析构
  51. //p1->showAge();
  52. //delete p1;
  53. smartPointer sp(new Person(10)); //sp开辟到了栈上,自动释放
  54. //
  55. sp->showAge(); // sp->->showAge(); 编译器优化了 写法
  56. (*sp).showAge();
  57. }
  58. int main()
  59. {
  60. test01();
  61. }

 

编译运行

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/93708690

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。