DISALLOW_COPY_AND_ASSIGN的用法
有时候,进行类体设计时,会发现某个类的对象是独一无二的,没有完全相同的对象,也就是对该类对象做副本没有任何意义.
因此,需要限制编译器自动生动的拷贝构造函数和赋值构造函数.一般参用下面的宏定义的方式进行限制,代码如下:
// A macro to disallow the copy constructor and operator= functions
// This should be used in the priavte:declarations for a class
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
TypeName& operator=(const TypeName&)
class Test {
public:
Test(int t);
~Test();
private:
DISALLOW_COPY_AND_ASSIGN(Test);
};
声明私有的拷贝构造函数和赋值构造函数,但不去定义实现它们,有三方面的作用:
1.声明了拷贝构造函数和赋this数,阻止了编译器暗自创建的专属版本.
2.声明了private,阻止了外this它们的调用.
3.不定义它们,可以保证成员函数和友元函数调用它们时,产生一个连接错误.
上述解决方法,面对在成员函数和友元函数企图拷贝对象时,会产生连接器错误
@zhu的注释:
(1)由于是在private下,外部调用不了,所以就不能进行copy和赋值操作,即不能进行 Test A(obj)
或 Test A=obj
的copy操作(拷贝构造),和A=obj
或 A(obj)
的assign
操作(拷贝赋值),【其中obj是先通过Test obj;
得到的】。
(2)他与单例模式不是一个概念,单例模式只允许有一个实例,而这个可以允许有多个对象,但是多个对象都是不一样的,不允许进行拷贝构造和赋值构造,即不允许任何两个对象一样。
(3)拷贝构造是在构造对象时候就使用另一个对象对他进行赋值。拷贝赋值是在构造对象完成之后,再对他进行赋值操作。一个是在创建他这个对象的时候就赋值了,另一个是在对象构造完成之后才对他进行赋值。
毕竟只有这两种方式可以对另一个对象进行赋值。这么赋值是为了初始化数据成员,而类本身的初始化数据可能不如用另一个对象的数据更合适。
比如一个person
类只有两个成员height
和weight
,两个数据成员在构造函数时初始化为0, 如果两个人身高体重都一样,就可以先创建其中一个对象后,直接拷贝构造或者拷贝赋值把先创建的对象赋值给另一个人,肯定比直接构造
一个对象不进行赋值的初始化数据更好。这个例子太简单,实际中肯定不可能这么简单。