怎么new一个指针_C++知识点 34:指针运算符重载 -- 智能指针
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;
// 平??赡苡龅揭粋€(gè)問題
class Test
{
public:
Test() {
cout << "默認(rèn)構(gòu)造函數(shù)被調(diào)用了" << endl;
}
~Test() {
cout << "析構(gòu)函數(shù)被調(diào)用了" << endl;
}
public:
int m_Age;
};
void test01()
{
Test t1; // 此時(shí)調(diào)用了系統(tǒng)默認(rèn)的構(gòu)造函數(shù)和析構(gòu)函數(shù)
Test* t2 = new Test; // 在堆區(qū)new一個(gè)對(duì)象,此時(shí)只會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)! 不會(huì)調(diào)用析構(gòu)函數(shù)
delete t2; // 只有在delete后才會(huì)調(diào)用析構(gòu)函數(shù) // 問題:如果 new 和 delete 中間代碼量特別大,有的人就極可能忘記delete
// 解決:使用智能指針去托管析構(gòu)函數(shù)的調(diào)用
}
****************************************************************************************
// 智能指針 SmartPoint
class Person
{
public:
Person() {
this->m_Age = 18; // 默認(rèn)構(gòu)造函數(shù) 對(duì)年齡初始化
}
void showAge(){
cout << "Age= " << this->m_Age << endl; // 查看年齡的成員函數(shù)
}
public:
int m_Age;
};---------------------------------------------------------------------------------------------------
// 創(chuàng)建智能指針類:維護(hù) new 出來的 Person*class SmartPoint
{
public: // 解決自動(dòng)delete問題
SmartPoint(Person* person) // 參數(shù)是通過 new Person 得到的
{
this->person = person; // 有參構(gòu)造函數(shù)作用:初始化,用于接收 new 出來的 Person *
}
~SmartPoint() // 實(shí)例化了SmartPoint對(duì)象, 就意味著會(huì)調(diào)用析構(gòu)函數(shù), 那么就意味著會(huì)自動(dòng)delete
{
// 釋放掉堆區(qū)對(duì)象
if (this->person != NULL)
{
delete this->person;
this->person = NULL;
}
}
public: // 解決 ? 和 * 重載問題
// 指針 ? 運(yùn)算符的重載 // 傳入的是 person (Person* person = new Person)
Person* operator->()
{
return this->person;
}
// 解引用 * 運(yùn)算符重載 // 傳入的是 person (Person* person = new Person)
Person& operator*()
{
return *person;
}---------------------------------------------------------------------------------------------------
public:
Person* person; // 維護(hù)一個(gè)new出來的對(duì)象指針
};
****************************************************************************************
void test02()
{
SmartPoint sp(new Person); // 調(diào)用SmartPoint的有參構(gòu)造, 本質(zhì)是new的一個(gè)Person類的指針: person /*
說明:
正常: Person* p = new Person // p 是指針,用法 p->
采用指針指針維護(hù), SmartPoint sp(new Person) // sp是類,用法 sp.
需求: sp指針化 // sp.的操作 變?yōu)?sp-> // 也可以解引用在化為類
解決:指針運(yùn)算符的重載( 2方面: sp.的操作 變?yōu)?sp-> 以及 *(sp))
*/
sp->showAge(); // 注意, sp->返回值為指針,其實(shí)應(yīng)該寫成sp->->showAge(), 但系統(tǒng)做了優(yōu)化
(*sp).showAge(); // sp已經(jīng)指針化, *sp還原成類,使用.操作
}
總結(jié)
以上是生活随笔為你收集整理的怎么new一个指针_C++知识点 34:指针运算符重载 -- 智能指针的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ftp搜索文件_Windows10下搭建
- 下一篇: 第19课 比大小 《小学生C++趣味编程