码迷,mamicode.com
首页 > 编程语言 > 详细

如何禁止C++ 类支持拷贝

时间:2014-07-01 08:04:25      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   2014   工作   c++   

如何禁止C++ 类支持拷贝


C++ 编译器默默地为你做了不少工作

  • 当你写下 
    class Empty {};
    //其实等价于
    class Empty {
    public:
        Empty() { ... } //default constructor
        Empty(const Empty &rhs) { ... } //copy constructor
        ~Empty() { ... } //destructor
    
        Empty& operator=(const Empty &rhs) { ... } //copy assignment
    };
  • 然而,有的时候,你却想禁止类进行复制。如果你不声明 copy 构造函数或者 copy assignment 操作符,编译器将为你产生一份;如果你声明他们,你的类同样支持 copying。

解决方案:

  • 将拷贝构造函数和copy assignment 声明为 private, 并不给出实现; 一般而言,member 函数和 friend 函数还是有可能调用它们,这会导致一个链接错误(因为你没有定义函数)
    class A {
    public:
    private:
        A(const A &rhs); //只有声明
        A& operator=(const A &rhs);
    };
  • 更好的做法,可以将做法1 的连接错误转移到编译期(越早发现错误越好)。让类继承 如下的base 类这可行的原因在于:只要任何人----甚至是 member 函数 或 friend 函数-----尝试拷贝对象,编译器都会试着生成一个 copy 构造函数和 copy assignment 操作符,而这些函数的“编译器生成版”会尝试调用 base class 的对应兄弟,而这些调用会被编译器拒绝,因此 base class 的拷贝函数是 private。
    class Uncopyable {
    public:
      Uncopyable() {}
      ~Uncopyable() {}
    private:
      Uncopyable(const Uncopyable&);
      Uncopyable& operator=(const Uncopyable&);
    };
    class B : private Uncopyable {
    };
    




如何禁止C++ 类支持拷贝,布布扣,bubuko.com

如何禁止C++ 类支持拷贝

标签:des   style   blog   2014   工作   c++   

原文地址:http://blog.csdn.net/shoulinjun/article/details/35991441

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!