1. 程式人生 > >C++如何禁止對象的復制操作

C++如何禁止對象的復制操作

-a adl alt dave tools sta 友元 pos board

最容易想到的是將拷貝構造函數與賦值函數聲明為private。但是,private只是說外部不能直接調用,但是可以間接通過類的成員函數與友元函數對其訪問。那麽怎麽辦呢?

----》在類中,允許聲明函數,但是,可以不用實現該函數,這是合法的。那麽即使是在public中聲明函數,但是不實現,那麽調用這個函數也是會出錯的。


那麽好了我們可以特性一起使用,boost::noncopyable

[cpp] view plain copy
  1. #ifndef BOOST_NONCOPYABLE_HPP_INCLUDED
  2. #define BOOST_NONCOPYABLE_HPP_INCLUDED
  3. namespace boost {
  4. // Private copy constructor and copy assignment ensure classes derived from
  5. // class noncopyable cannot be copied.
  6. // Contributed by Dave Abrahams
  7. namespace noncopyable_ // protection from unintended ADL
  8. {
  9. class noncopyable
  10. {
  11. protected:
  12. noncopyable() {}
  13. ~noncopyable() {}
  14. private: // emphasize the following members are private
  15. noncopyable( const noncopyable& );
  16. const noncopyable& operator=( const noncopyable& );
  17. };
  18. }
  19. typedef noncopyable_::noncopyable noncopyable;
  20. } // namespace boost
  21. #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++如何禁止對象的復制操作