通过拷贝新建对象时可使用拷贝构造函数(特别是对象的传值时)。仅在代码中需要拷贝一个类对象的时候使用拷贝构造函数;不需要拷贝构造函数时应使用 DISALLOW_COPY_AND_ASSIGN
。
优点:拷贝构造函数使得拷贝对象更加容易,STL 要求所有内容可拷贝、可赋值。
缺点:C++ 中对象的隐式拷贝是导致很多性能问题和 bugs 的根源。拷贝构造函数降低了代码的可读性,相比按引用传递,跟踪按值传递的对象更加困难,对象修改的地方变得难以捉摸。
结论:大量的类并不需要可拷贝,也不需要一个拷贝构造函数或赋值操作。不幸的是,如果你不主动声明它们,编译器会为你自动生成,而且是 public
的。
一个解决的方法是,在类的 private
中添加空的(dummy)拷贝构造函数和赋值操作,只有声明而没有定义。由于这些空程序声明为 private
,当其他代码试图使用它们的时候,编译器将报错。为了方便,可以使用宏 DISALLOW_COPY_AND_ASSIGN
。如果类确实需要可拷贝,应在该类的头文件中说明缘由,并适当定义拷贝构造函数和赋值操作,注意在 operator= 中检测自赋值的情况。
在将类作为 STL 容器值的时候,应该使用指针指向 STL 容器中的对象,而不是使类可拷贝,可以考虑使用 std::tr1::shared_ptr。
网友评论