(最后附有完整实现代码)
作用:用来托管自定义类型的对象,让对象可以自己释放。
在C++中使用new实例化一个该类的对象时,使用完这个对象后我们需要自己去释放这一块向堆区申请的空间。
那么如果我们忘记释放某一个new出来的对象,那么就可能造成内存泄漏的情况。为了避免这样的情况出现,就出现了智能指针这个概念。

我们先构建了一个person类,然后又创建了一个smartperson类,在smartperson类中存放了person类的指针,然后定义了一个size,这样就定义好了一个指向person类的智能指针类smartperson。

我们在有智能指针的参构造中,让他自动去new出你需要的person类的对象个数。然后在析构函数中,也让他自动去销毁刚才new出来的person类对象。
下面我们来看一个测试案例
我们直接使用类名的方式实例化一个smartperson类对象sp。那么这个局部变量在出他的作用域时,会被直接销毁掉(自动调用自身的析构函数),那他就可以直接delete刚才new出的person对象。
我们在使用智能去调用person类中的成员属性或者方法时,会比较麻烦
所以为了方便,智能指针一般搭配指针类重载函数使用。
我们直接在smartperson类的添加了->运算符重载函数方法。那么现在就可以直接通过sp去访问person中成员属性了。

对于->运算符来说,->的左侧必须的类的指针,右侧是类中的属性或者方法,这里的sp->data,这个->匹配到了operator->函数,那么sp->在编译完成后,调用了operator->函数。返回了person类的指针,this->smart_person,也就是通过这个指针,才能访问person类的成员属性。
*重载与->重载类似,也是可以直接定义在smartperson类中,只不过要注意一下返回类型。
我们在操作时想要达成的目的是(*sp)可以直接点出person类的属性,那么这里的返回类型必须是person的引用,那么需要返回这个引用,就要先拿到这个类,所以这里 return *this->smart_person;
实现好*重载函数后smartperson对象就可以通过点操作符去访问person类中属性了
我们在调用有参的smartperson类的构造函数创建person类对象时,如果我们new了不只一个person类对象,那么在访问时也会比较麻烦
所以这里需要对[]运算符进行重载,就可以使得sp直接调用【】运算符去操作person类的属性了。
我们直接在smartperson类中对[]运算符进行重载

可以看到重载后,就可以直接通过sp与【】直接去访问person类对象的属性了。
当然这里最重要的还是返回类型,sp【0】调用了person& operator[](int tmp)函数,将this->smart_person[tmp]的引用返回,所以这里可以直接访问person类对象的属性了。
最后附上完整的实现代码
- #include<iostream>
- using namespace std;
-
- class person
- {
- public:
- int data;
-
- ~person()
- {
- cout << "person类析构函数调用" << endl;
- }
- };
-
- class smartperson
- {
- public:
- smartperson(int tmp)
- {
- this->size = tmp;
- this->smart_person = new person[this->size];
- }
- ~smartperson()
- {
- if (this->smart_person != NULL)
- {
- delete[]this->smart_person;
- this->smart_person = NULL;
- }
- }
-
- person* operator->()
- {
- return this->smart_person;
- }
-
- person& operator*()
- {
- return *this->smart_person;
- }
-
- person& operator[](int tmp)
- {
- return this->smart_person[tmp];
- }
-
- int size;
- person* smart_person;
- };
-
- void test1()
- {
- smartperson sp(4);
- sp.smart_person[0].data= 1;//比较麻烦
- sp[0].data;
- }
-
- int main()
- {
- test1();
- return 0;
- }
注意:这里的这些指针类型的重载函数最好写成成员函数的形式会比较方便。