C++智能指針怎么使用

本篇內(nèi)容主要講解“C++智能指針怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++智能指針怎么使用”吧!

按需求定制網(wǎng)站可以根據(jù)自己的需求進行定制,做網(wǎng)站、成都網(wǎng)站設(shè)計構(gòu)思過程中功能建設(shè)理應排到主要部位公司做網(wǎng)站、成都網(wǎng)站設(shè)計的運用實際效果公司網(wǎng)站制作網(wǎng)站建立與制做的實際意義

1.什么是智能指針

C++智能指針是包含重載運算符的類,其行為像常規(guī)指針,但智能指針能夠及時妥善地銷毀動態(tài)分配的數(shù)據(jù),并實現(xiàn)了明確的對象生命周期,因此更有價值。
常規(guī)指針存在的問題
C++在內(nèi)存分配、釋放和管理方面提供了全面的靈活性;另一方面,它有可能產(chǎn)生與內(nèi)存相關(guān)的問題,比如動態(tài)分配的對象沒有正確地釋放將導致內(nèi)存泄漏。
智能指針的作用
智能指針的行為類似常規(guī)指針,但通過重載的運算符和析構(gòu)函數(shù)確保動態(tài)分配的數(shù)據(jù)能夠及時地銷毀,從而提供了更多有用的功能。
smart_pointer spDate = mObject.GetData ();
spData->Display();
(*spData).Display();

2.智能指針的實現(xiàn)

智能指針類重載了解除引用運算符(*)和成員選擇運算符(->),使得可以像常規(guī)指針那樣使用它們。下面演示一個簡單智能指針類的實現(xiàn):

template <typename T>class smart_pointer{
   
   
   private:
	T* m_pRawPointer;public:smart_pointer(T* pData) : m_pRawPointer(pData){
   
   
   }   //構(gòu)造函數(shù)~smart_pointer(){
   
   
   delete pData;}; //析構(gòu)函數(shù)smart_pointer(const smart_pointer & anotherSP); //復制構(gòu)造函數(shù)
	smart_pointer& operator= (const smart_pointer & anotherSP);
	T& operator*() const{
   
   
   return *(m_pRawPointer);}
	T* operator() const{
   
   
   return m_pRawPointer;}};

3.智能指針類型

智能指針決定在復制和賦值時如何處理內(nèi)存資源。智能指針的分類實際上就是內(nèi)存資源管理策略的分類??煞譃橐韵聨最悾?br/>深復制、寫時復制、引用計數(shù)、引用鏈接、破壞性復制。
深復制
在實現(xiàn)深復制的智能指針中,每個智能指針實例都保存一個它管理的對象的完整副本。每當智能指針被復制時,將復制它指向的對象。每當智能指針離開作用域時,將釋放它指向的內(nèi)存。
雖然基于深復制的智能指針看起來并不比按值傳遞對象優(yōu)越,但在處理多態(tài)對象時,其優(yōu)點將顯示出來。
下面演示使用基于深復制的智能指針能將多態(tài)對象作為基類對象進行傳遞。

template<typename T>class deepcopy_smart_pointer{
   
   
   private:
	T* m_pObject;public:deepcopy_smart_pointer(const deepcopy_smart_pointer& source)  //復制構(gòu)造函數(shù){
   
   
   
		m_pObject = source->Clone();}
	deep_smart_pointer& operator=(const deepcopy_smart_pointer& source)  //復制賦值運算符{
   
   
   if(m_pObject)delete m_pObject;
		m_pObject=source->Clone();}};

4.使用std::unique_ptr

std::unique_ptr 是一種簡單的智能指針,但其復制構(gòu)造函數(shù)和賦值運算符被聲明為私有的,因此不能復制它,即不能將其按值傳遞給函數(shù),也不能將其賦值給其他指針。
unique_ptr是C++11新增的,與auto_ptr稍微不同,因為它不允許復制和賦值。使用std::unique_ptr,必須包含頭文件:

#include <memory>

下面將演示如何使用最簡單的智能指針:

#include <iostream>#include <memory>using namespace std;class Fish{
   
   
   public:Fish(){
   
   
   cout<<"構(gòu)造函數(shù)"<<endl;}~Fish(){
   
   
   cout<<"析構(gòu)函數(shù)"<<endl;}void Swim() const {
   
   
   cout<<"Fish swim in watar"<<endl;}};void MakeFishSwim(const unique_ptr<Fish>& inFish){
   
   
   
	inFish->Swim();}int main(){
   
   
   
	unique_ptr<Fish> smartFish(new Fish);
	smartFish->Swim();MakeFishSwim(smartFish);return 0;}

到此,相信大家對“C++智能指針怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

本文題目:C++智能指針怎么使用
分享地址:http://bm7419.com/article24/gipoce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)Google、網(wǎng)站收錄、小程序開發(fā)、外貿(mào)網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作