最容易想到的是將拷貝建構函式與賦值函式宣告為private。但是,private只是說外部不能直接呼叫,但是可以間接通過類的成員函式與友元函式對其訪問。那麼怎麼辦呢?
----》在類中,允許宣告函式,但是,可以不用實現該函式,這是合法的。那麼即使是在public中宣告函式,但是不實現,那麼呼叫這個函式也是會出錯的。
那麼好了我們可以特性一起使用,boost::noncopyable
[cpp]view plain
copy
?#ifndef boost_noncopyable_hpp_included
#define boost_noncopyable_hpp_included
namespace boost
~noncopyable() {}
private: // emphasize the following members are private
noncopyable( const noncopyable& );
const noncopyable& operator=( const noncopyable& );
};
}
typedef noncopyable_::noncopyable noncopyable;
} // namespace boost
#endif // boost_noncopyable_hpp_included
為了禁止拷貝物件,我們只需要讓其私有繼承自boost::noncopyable,
class student:private boost::noncopyable
當呼叫到派生類的拷貝建構函式或賦值函式進行複製時,不可避免的要呼叫基類對應的函式,因為這些操作是private,這樣的操作會被編譯器拒絕。
需要注意,多重繼承有時會使空基類noncopyable優化失效,所以這不適合用於多重繼承的情形。
另外,如果只是不想要使用預設的拷貝建構函式或賦值函式,可以使用c++11提供的delete,
class myclass
當然,一旦函式被delete過了,那麼過載該函式也是非法的,該函式我們習慣上稱為刪除函式。
C 如何禁止掉物件的複製操作
最容易想到的是將拷貝建構函式與賦值函式宣告為private。但是,private只是說外部不能直接呼叫,但是可以間接通過類的成員函式與友元函式對其訪問。那麼怎麼辦呢?在類中,允許宣告函式,但是,可以不用實現該函式,這是合法的。那麼即使是在public中宣告函式,但是不實現,那麼呼叫這個函式也是會出錯...
C 如何禁止掉物件的複製操作
那麼好了我們可以特性一起使用,boost noncopyable cpp view plain copy print?ifndef boost noncopyable hpp included define boost noncopyable hpp included namespace boost...
C 如何徹底禁止掉物件的複製操作
在物件導向的世界中,有一些物件是需要保持獨一無二的,如設計乙個 公民 的類,每個公民都是唯一的,有唯一的身份證號與其對應。任何對該物件的複製都是毫無意義的,需要在類的設計上被徹底禁止掉。普通的c 菜鳥會說,那我在類的設計裡,不去實現拷貝構造和賦值操作不就完了嗎?其實不行!c 會在背後偷偷的幫你現實乙...