首页 > 代码库 > 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++ 拷贝构造函数优缺点