首页 > 代码库 > c++ 拷贝构造函数优缺点

c++ 拷贝构造函数优缺点

    前一段时间去面试,被人问了一个这个问题, 突然不知道怎么回答了, 后来查了查,才知道原来是怎么样了, 现在总结一下吧。

拷贝构造函数和赋值运算符用于创建对象的副本。在某些情况下由编译器隐式调用拷贝构造函数,例如按值传递对象的时候。

优点:
拷贝构造函数可以很容易地复制对象。 STL容器要求所有内容可拷贝和赋值。拷贝构造函数可以比copyfrom()式的解决方法更有效,因为它们将构造和复制结合在一起。

缺点:
对象的隐式拷贝是C++中是错误和性能问题的来源之一。它也降低了代码的可读性,并使得对象子程序中的传递和改变变得难以跟踪。

只有很少的类需要拷贝。绝大部分的类既不需要拷贝构造函数,也不需要赋值操作符函数。在大多数情况下,使用指针或引用可以完成相同的任务,并具有更好的性能。例如,可以通过引用或指针,而不是通过值传递函数的参数。在STL容器中存储对象的指针,而不是存储对象的拷贝。

如果你的类需要拷贝,可以提供用于复制的方法,如copyfrom()或者clone(),而不是使用拷贝构造函数,因为这种方法不能被编译器隐式调用。如果提供的复制方法不够用,在具体情况下(如性能方面的原因,或者是因为你的类需要按值存储在STL容器中),考虑同时提供拷贝构造函数和赋值操作符函数。

如果你的类并不需要拷贝构造函数或赋值操作符函数,你必须显式地禁用它们。要做到这一点,可以在类的私有(private)部分,添加拷贝构造函数和赋值操作符函数的空申明,但不提供任何相应的定义。因此,任何使用它们的企图都会导致链接错误(link error)。

为了方便, 可以使用DISALLOW_COPY_AND_ASSIGN宏:

// A macro to disallow the copy constructor and operator= functions
// This should be used in the private: declarations for a class
#define DISALLOW_COPY_AND_ASSIGN(TypeName) TypeName(const TypeName&);               void operator=(const TypeName&)

然后在类Foo中这样使用:

class Foo {
 public:
  Foo(int f);
  ~Foo();
 
 private:
  DISALLOW_COPY_AND_ASSIGN(Foo);
};

这样就好了

c++ 拷贝构造函数优缺点