【c++】2.DISALLOW_COPY_AND_ASSIGN的用法

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=objA(obj)assign操作(拷贝赋值),【其中obj是先通过Test obj;得到的】。

(2)他与单例模式不是一个概念,单例模式只允许有一个实例,而这个可以允许有多个对象,但是多个对象都是不一样的,不允许进行拷贝构造和赋值构造,即不允许任何两个对象一样。

(3)拷贝构造是在构造对象时候就使用另一个对象对他进行赋值。拷贝赋值是在构造对象完成之后,再对他进行赋值操作。一个是在创建他这个对象的时候就赋值了,另一个是在对象构造完成之后才对他进行赋值。
毕竟只有这两种方式可以对另一个对象进行赋值。这么赋值是为了初始化数据成员,而类本身的初始化数据可能不如用另一个对象的数据更合适。
比如一个person类只有两个成员heightweight,两个数据成员在构造函数时初始化为0, 如果两个人身高体重都一样,就可以先创建其中一个对象后,直接拷贝构造或者拷贝赋值把先创建的对象赋值给另一个人,肯定比直接构造
一个对象不进行赋值的初始化数据更好。这个例子太简单,实际中肯定不可能这么简单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值