在C++中,内存中的存储区域分为好几类:栈、堆等等,在不同的存储区域创建不同的变量,需要程序员做出不同的操作,在堆区中创建变量时,最后都需要程序员手动的去进行释放空间,为了解决这个问题,可以通过对指针进行重载,即智能指针,使得程序员不需要再去手动释放空间。
堆区创建类并手动释放空间:
#include<iostream>
using namespace std;
class Person
{
public:
Person(int age)
{
this->m_age = age;
}
int m_age;
void showage()
{
cout << "年龄为:" << m_age << endl;
}
~Person()
{
cout << "Person的析构函数!" << endl;
}
};
void test01()
{
Person p1(10); //在栈上开辟空间创建类,会自动调用析构函数,在栈上开辟的空间,编译器会自动帮忙释放
Person* p1 = new Person(10); //在堆上开辟空间创建类,需要调用delete去进行析构,在堆上开辟的空间需要程序员去手动释放
delete p1;
}
void main()
{
test01();
}
创建智能指针类:
#include<iostream>
using namespace std;
class Person
{
public:
Person(int age)
{
this->m_age = age;
}
int m_age;
void showage()
{
cout << "年龄为:" << m_age << endl;
}
~Person()
{
cout << "Person的析构函数!" << endl;
}
};
// 智能指针:用来托管自定义类型的对象,让对象进行自动的释放
class smartPointer
{
public:
smartPointer(Person* person)
{
this->person = person;
}
//重载 -> 运算符,因为返回的是Person指针,所以operator前面是Person*
Person* operator->()
{
return this->person;
}
`
~smartPointer()
{
if (this->person != NULL)
{
cout << "通过智能指针将person析构了" << endl;
delete this -> person;
this->person = NULL;
}
}
private:
Person* person;
};
void test01()
{
//Person p1(10); //在栈上开辟空间创建类,会自动调用析构函数,在栈上开辟的空间,编译器会自动帮忙释放
//Person* p1 = new Person(10); //在堆上开辟空间创建类,需要调用delete去进行析构,在堆上开辟的空间需要程序员去手动释放
//delete p1;
smartPointer sp(new Person(10)); // 此时通过智能指针的作用在栈上开辟了空间,就不需要程序员再去进行空间的释放
sp->showage();//为了能够让这个指针更加的智能,并且能够代替Person指针调用showage,需要随 -> 运算符进行重载
}
void main()
{
test01();
}
运行结果:
可以发现智能指针能够帮助调用Person类的析构函数
指针的重载:
#include<iostream>
using namespace std;
class Person
{
public:
Person(int age)
{
this->m_age = age;
}
int m_age;
void showage()
{
cout << "年龄为:" << m_age << endl;
}
~Person()
{
cout << "Person的析构函数!" << endl;
}
};
// 智能指针:用来托管自定义类型的对象,让对象进行自动的释放
class smartPointer
{
public:
smartPointer(Person* person)
{
this->person = person;
}
//重载 -> 运算符,因为返回的是Person指针,所以operator前面是Person*
Person* operator->()
{
return this->person;
}
//重载 * 运算符
Person& operator*()
{
return *this->person;
}
~smartPointer()
{
if (this->person != NULL)
{
cout << "通过智能指针将person析构了" << endl;
delete this -> person;
this->person = NULL;
}
}
private:
Person* person;
};
void test01()
{
smartPointer sp(new Person(10));
(*sp).showage();
}
void main()
{
test01();
}
运行结果同上。
注意,在进行创建和使用智能指针时,通常需要重载 -> 和 * 运算符
在写重载函数时,返回值有不同的地方,在第二段代码中重载 -> 操作符时,返回值为Person*,因为需要把 -> 重载为指向Person的指针
在第三段代码中,返回值为指针的引用,即把内部维护的Person指针按引用的方式返回。