代码之家  ›  专栏  ›  技术社区  ›  Emile Cormier

通常让重量级的类不可复制是一种好的做法吗?

  •  1
  • Emile Cormier  · 技术社区  · 15 年前

    我有一个可能包含许多顶点的Shape类,我正在考虑将copy constructor/copy assignment设为私有,以防止对我的重量级类进行意外的不必要的复制(例如,通过值而不是通过引用传递)。

    要复制Shape,必须有意识地调用“clone”或“duplicate”方法。

    这种做法好吗?我想知道为什么STL容器不使用这种方法,因为我很少按值传递它们。

    5 回复  |  直到 10 年前
        1
  •  7
  •   Eli Bendersky    15 年前

    限制你的用户并不总是一个好主意。仅仅记录复制可能很昂贵就足够了。如果用户真的想要复制,那么通过提供复制构造函数来使用C++的本机语法是一个更为清洁的方法。

        2
  •  4
  •   AProgrammer    15 年前

    IMHO,提供复制构造函数和赋值运算符与否更多地取决于类的模型化程度,而不是复制的成本。

    如果你的班级代表 价值观

    如果你的类不是,那就是如果你认为这个类的对象有一个身份和一个状态(你也可以这么说) 实体 ),不要。如果副本有意义,请为其提供克隆或副本成员。

    map<int, list<> >

        3
  •  4
  •   Artyom    15 年前

    一般来说,不会因为类太重而使它们不可复制(您已经展示了一个很好的STL示例)。

    当它们连接到一些不可复制的资源(如socket、file、lock)或它们不可复制时,您会使它们不可复制 设计

    关于 clone() --它用作多态复制构造函数--它具有不同的

        4
  •  4
  •   AshleysBrain    15 年前

    注意STL的vector、string、map、list等都可以被视为“重量级”对象(特别是像一个包含10000个元素的vector之类的东西!)。这些类仍然提供复制构造函数和赋值运算符,因此如果您知道自己在做什么(例如制作一个std::向量列表),那么您可以在必要时复制它们。

    因此,如果有用,无论如何都要提供它们,但一定要记录它们是昂贵的操作。

        5
  •  2
  •   Brian R. Bondy    15 年前

    如果您想确保拷贝不会发生错误,并且制作拷贝会导致严重的瓶颈或者根本没有意义,那么这是一个好的实践。编译错误比性能调查更好。

    推荐文章