C++如何禁止對象的復制操作
阿新 • • 發佈:2018-03-18
-a adl alt dave tools sta 友元 pos board
最容易想到的是將拷貝構造函數與賦值函數聲明為private。但是,private只是說外部不能直接調用,但是可以間接通過類的成員函數與友元函數對其訪問。那麽怎麽辦呢?
----》在類中,允許聲明函數,但是,可以不用實現該函數,這是合法的。那麽即使是在public中聲明函數,但是不實現,那麽調用這個函數也是會出錯的。
那麽好了我們可以特性一起使用,boost::noncopyable
[cpp] view plain copy- #ifndef BOOST_NONCOPYABLE_HPP_INCLUDED
- #define BOOST_NONCOPYABLE_HPP_INCLUDED
- namespace boost {
- // Private copy constructor and copy assignment ensure classes derived from
- // class noncopyable cannot be copied.
- // Contributed by Dave Abrahams
- namespace noncopyable_ // protection from unintended ADL
- {
- class noncopyable
- {
- protected:
- noncopyable() {}
- ~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
{
public:
MyClass()=default;
MyClass(const MyClass& )=delete;
......
}
當然,一旦函數被delete過了,那麽重載該函數也是非法的,該函數我們習慣上稱為刪除函數。
C++如何禁止對象的復制操作