zoukankan      html  css  js  c++  java
  • C++如何禁止掉对象的复制操作

    最容易想到的是将拷贝构造函数与赋值函数声明为private。但是,private只是说外部不能直接调用,但是可以间接通过类的成员函数与友元函数对其访问。那么怎么办呢?

    ----》在类中,允许声明函数,但是,可以不用实现该函数,这是合法的。那么即使是在public中声明函数,但是不实现,那么调用这个函数也是会出错的。


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

    1. #ifndef BOOST_NONCOPYABLE_HPP_INCLUDED    
    2. #define BOOST_NONCOPYABLE_HPP_INCLUDED    
    3.     
    4. namespace boost {    
    5.     
    6. //  Private copy constructor and copy assignment ensure classes derived from    
    7. //  class noncopyable cannot be copied.    
    8.     
    9. //  Contributed by Dave Abrahams    
    10.     
    11. namespace noncopyable_  // protection from unintended ADL    
    12. {    
    13.   class noncopyable    
    14.   {    
    15.    protected:    
    16.       noncopyable() {}    
    17.       ~noncopyable() {}    
    18.    private:  // emphasize the following members are private    
    19.       noncopyable( const noncopyable& );    
    20.       const noncopyable& operator=( const noncopyable& );    
    21.   };    
    22. }    
    23.     
    24. typedef noncopyable_::noncopyable noncopyable;    
    25.     
    26. // namespace boost    
    27.     
    28. #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过了,那么重载该函数也是非法的,该函数我们习惯上称为删除函数。

  • 相关阅读:
    File类总结
    MyBatis框架一级缓存与二级缓存
    SpringMVC运行原理总结
    SpringMVC:详述拦截器
    SpringMVC:自定义视图及其执行过程
    详述ThreadLocal
    浅析MVC中的数据流动
    error: gpg failed to sign the data 的一个解决办法
    保险业务核心系统设计参考
    奇怪的404
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/6591736.html
Copyright © 2011-2022 走看看