怎么new一个指针_C++知识点 34:指针运算符重载 -- 智能指针

#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
// 平常可能遇到一个问题
class Test
{
public:
Test() {
cout << "默认构造函数被调用了" << endl;
}

~Test() {
cout << "析构函数被调用了" << endl;
}
public:
int m_Age;
};

void test01()
{
Test t1; // 此时调用了系统默认的构造函数和析构函数
Test* t2 = new Test; // 在堆区new一个对象,此时只会调用默认构造函数! 不会调用析构函数
delete t2; // 只有在delete后才会调用析构函数 // 问题:如果 new 和 delete 中间代码量特别大,有的人就极可能忘记delete
// 解决:使用智能指针去托管析构函数的调用

}
****************************************************************************************
// 智能指针 SmartPoint
class Person
{
public:
Person() {
this->m_Age = 18; // 默认构造函数 对年龄初始化
}
void showAge(){
cout << "Age= " << this->m_Age << endl; // 查看年龄的成员函数
}
public:
int m_Age;
};---------------------------------------------------------------------------------------------------
// 创建智能指针类:维护 new 出来的 Person*
class SmartPoint
{
public: // 解决自动delete问题
SmartPoint(Person* person) // 参数是通过 new Person 得到的
{
this->person = person; // 有参构造函数作用:初始化,用于接收 new 出来的 Person *
}

~SmartPoint() // 实例化了SmartPoint对象, 就意味着会调用析构函数, 那么就意味着会自动delete
{
// 释放掉堆区对象
if (this->person != NULL)
{
delete this->person;
this->person = NULL;
}
}

public: // 解决  和 * 重载问题
// 指针  运算符的重载 // 传入的是 person (Person* person = new Person)
Person* operator->()
{
return this->person;
}
// 解引用 * 运算符重载 // 传入的是 person (Person* person = new Person)
Person& operator*()
{
return *person;
}---------------------------------------------------------------------------------------------------
public:
Person* person; // 维护一个new出来的对象指针
};
****************************************************************************************
void test02()
{
SmartPoint sp(new Person); // 调用SmartPoint的有参构造, 本质是new的一个Person类的指针: person /*
说明:
正常: Person* p = new Person // p 是指针,用法 p->
采用指针指针维护, SmartPoint sp(new Person) // sp是类,用法 sp.
需求: sp指针化 // sp.的操作 变为 sp-> // 也可以解引用在化为类
解决:指针运算符的重载( 2方面: sp.的操作 变为 sp-> 以及 *(sp))
*/

sp->showAge(); // 注意, sp->返回值为指针,其实应该写成sp->->showAge(), 但系统做了优化
(*sp).showAge(); // sp已经指针化, *sp还原成类,使用.操作
}

f83b9ef81277ab5e63aecba5d5f4800e.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值