當我們定義乙個類時,我們顯示地或隱式地指定在此型別的物件拷貝、移動、賦值和銷毀時做什麼。乙個類通過定義五種特殊的成員函式來控制這些操作,包括:拷貝建構函式、拷貝賦值運算子、移動建構函式、移動賦值運算子和析構函式。我們稱這些操作作為拷貝控制操作。
如果乙個類沒有定義所有的這些拷貝控制成員,編譯器會自動為它定義缺失的操作。很多類會忽略這些拷貝控制操作。但是,對一些類來說,依賴這些操作的預設設定會導致災難。
有時候,當我們定義某個類時,我們可能不希望我們定義的類進行拷貝操作。為此,我們可以採用將拷貝構造和拷貝賦值宣告為private(私有)的,這樣的話就能禁止類進行拷貝操作。不過,這樣做的話,顯得比較麻煩。為此,boost中就提供noncopyable,我們通過繼承noncopyable就可以實現禁止拷貝了。
下面是boost::noncopyable類的實現。在實現中,將建構函式和析構函式宣告為保護,這樣不會影響noncopyable作為基類,也避免外部構建乙個noncopyable實類。
namespace noncopyable_ // protection from unintended adl
~noncopyable() {}
private:
// emphasize the following members are private
noncopyable( const noncopyable& );
noncopyable& operator=( const noncopyable& );
}; typedef noncopyable_::noncopyable noncopyable;
};
那麼,問題來了。為什麼將noncopyable作為基類,能使派生類實現禁止拷貝? 這是因為,在派生類拷貝過程中,主要分為2部分:首先,呼叫基類的複製建構函式完成基類部分的複製,然後再複製派生類的部分。由於基類的拷貝建構函式和拷貝賦值運算子宣告為私有的,派生類無法訪問。所以,在第一部分的時候已經失敗了,這就成功的禁止派生類的拷貝功能。
我們可以嘗試寫如下的測試**,編譯環境vs2013。
當我們未使用boost::noncopyable時:
class myclass
~myclass() {}
};int main(void)
此時,編譯成功。
當我們使用boost::noncopyable時:
#include class myclass : public boost::noncopyable
~myclass() {}
};int main(void)
此時,編譯不通過。說明確實禁止了類的拷貝功能。 拷進去,拷出來 拷貝物件是STL的方式
當你向stl容器中新增乙個物件的時候,進入容器的是你指定物件的拷貝 同樣,當你從容器獲取乙個物件時,你所得到的物件不是容器裡面的那個物件,而是那個物件的拷貝。一旦乙個物件進入乙個容器,以後對它的拷貝就多了。比如你從vector string或deque中插入或刪除元素,現有容器的元素就會移動 拷貝 ...
經典亂碼錕斤拷
錕斤拷是什麼?我也是最近才搞明白的。我考證了一下,這個亂碼的原因 相當經典。unicode和老編碼體系的轉化過程中,肯定有一些字,用unicode是沒法表示的,unicode官方用了乙個佔位符來表示這些文字,這就是 u fffd replacement character 那麼u fffd的utf ...
HTML頁面禁止選擇 頁面禁止複製 頁面禁止右鍵
轉至 html頁面內容禁止選擇 複製 右鍵 剛在乙個看乙個站點的源 的的時候發現的,其實原來真的很簡單 關鍵就在 nc ntextmenu return false ndragstart return false onselectstart return false nselect document...