#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还原成类,使用.操作
}