溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++11的const怎么引用

發(fā)布時間:2021-11-29 11:39:33 來源:億速云 閱讀:107 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“C++11的const怎么引用”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

const引用

在C++語言中,引用是作為一種高效,安全的傳遞數(shù)據(jù)的方式而存在的。除了一般的引用類型,還可以聲明const引用。

我們有以下一個Image類。

class Image
{
public:
   Image(int w, int h)
       :width(w), height(h)
   {
       data = new char[getSize()];
   }
   int getSize(){
       return width * height;
   }
   virtual ~Image(){
      if(data != nullptr){
           delete data;
           data = nullptr;
           width = 0;
           height = 0;
       }
   }
private:
   int width = 0;
   int height = 0;
   char* data = nullptr;
}

上面只是這個類的雛形,只有構(gòu)造函數(shù),析構(gòu)函數(shù)和取得數(shù)據(jù)大小的功能。

接下來添加比較兩個Image是否相同的函數(shù)。最簡單的形式大致如下。

bool isSame(Image& img)
{
   if(width == img.width
     && height == img.height){
       return (memcmp(data,img.data,getSize())==0);
   }
   else{
       return false;
   }
}

這里使用引用類型的參數(shù),避免了沒有必要的拷貝動作。當然我們還可以做得更好:由于比較函數(shù)沒有必要也不應(yīng)該對比較對象的內(nèi)容進行修改,所以還可用下面的形式進行承諾:

bool isSame(const Image& img)
{
   if(width == img.width
     && height == img.height){
       char* in = static_cast<char*>(img.data);
       return (memcmp(data,in,getSize())==0);
   }
   else{
       return false;
   }
}

通過在參數(shù)前面增加const修飾符,向isSame方法的調(diào)用者保證,不會修改img的內(nèi)容。

右值引用

繼續(xù)添加將一個Image的一部分merge到另一個Image上的方法。函數(shù)的內(nèi)容大致如下(這里忽略處理的細節(jié)):

void merge(Image& img){
   //接管img中的數(shù)據(jù)。
   img.height = 0;
   img.width = 0;
   img.data = nullptr;
}

類似的操作在處理在輸入對象時一般有兩種處理方式。有時希望只是參照而不破壞輸入數(shù)據(jù),這時可以使用前面講到的為參數(shù)增加const修飾符的方式來承諾;有時為了提高效率或者其他的原因希望可以接管輸入的數(shù)據(jù),就像上面代碼的狀態(tài)。這時的行為更像是數(shù)據(jù)移動。

對于第二種方式,如果僅僅定義一般的引用類型,利用者根本沒有辦法通過方法聲明來確定這個操作是否會接管參數(shù)中的數(shù)據(jù)。這種不確定性會造成很大的麻煩。

解決這個問題的方法就是今天文章的題目--右值引用。代碼如下:

  

void merge(Image&& img){
   //接管img中的數(shù)據(jù)。
   img.height = 0;
   img.width = 0;
   img.data = nullptr;
}

我們將參數(shù)聲明為右值引用,要求像一個臨時變量一樣任性地使用數(shù)據(jù)。使用這個函數(shù)的方法如下:

Image img1(100, 100);
Image img2(100, 200);
img1.merge(std::move(img2));

注意代碼中的std::move,這是標準庫中提供的方法,它可以將左值顯式轉(zhuǎn)換為右值引用類型,從而告訴編譯器,可以像右值(臨時變量)一樣處理它。同時也意味著接下來除了對img2賦值或銷毀以外,不再使用它。

C++11通過使用右值引用提供了一種接管數(shù)據(jù)的標準方法。

“C++11的const怎么引用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI