您好,登錄后才能下訂單哦!
本篇內容介紹了“C++11的const怎么引用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
const引用
在C++語言中,引用是作為一種高效,安全的傳遞數據的方式而存在的。除了一般的引用類型,還可以聲明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;
}
上面只是這個類的雛形,只有構造函數,析構函數和取得數據大小的功能。
接下來添加比較兩個Image是否相同的函數。最簡單的形式大致如下。
bool isSame(Image& img)
{
if(width == img.width
&& height == img.height){
return (memcmp(data,img.data,getSize())==0);
}
else{
return false;
}
}
這里使用引用類型的參數,避免了沒有必要的拷貝動作。當然我們還可以做得更好:由于比較函數沒有必要也不應該對比較對象的內容進行修改,所以還可用下面的形式進行承諾:
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;
}
}
通過在參數前面增加const修飾符,向isSame方法的調用者保證,不會修改img的內容。
右值引用
繼續添加將一個Image的一部分merge到另一個Image上的方法。函數的內容大致如下(這里忽略處理的細節):
void merge(Image& img){
//接管img中的數據。
img.height = 0;
img.width = 0;
img.data = nullptr;
}
類似的操作在處理在輸入對象時一般有兩種處理方式。有時希望只是參照而不破壞輸入數據,這時可以使用前面講到的為參數增加const修飾符的方式來承諾;有時為了提高效率或者其他的原因希望可以接管輸入的數據,就像上面代碼的狀態。這時的行為更像是數據移動。
對于第二種方式,如果僅僅定義一般的引用類型,利用者根本沒有辦法通過方法聲明來確定這個操作是否會接管參數中的數據。這種不確定性會造成很大的麻煩。
解決這個問題的方法就是今天文章的題目--右值引用。代碼如下:
void merge(Image&& img){
//接管img中的數據。
img.height = 0;
img.width = 0;
img.data = nullptr;
}
我們將參數聲明為右值引用,要求像一個臨時變量一樣任性地使用數據。使用這個函數的方法如下:
Image img1(100, 100);
Image img2(100, 200);
img1.merge(std::move(img2));
注意代碼中的std::move,這是標準庫中提供的方法,它可以將左值顯式轉換為右值引用類型,從而告訴編譯器,可以像右值(臨時變量)一樣處理它。同時也意味著接下來除了對img2賦值或銷毀以外,不再使用它。
C++11通過使用右值引用提供了一種接管數據的標準方法。
“C++11的const怎么引用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。