前言
偶然间看到别人写的代码有这么一小片段
Q_DISABLE_COPY(类名)
然后再往里追踪
#define Q_DISABLE_COPY(Class) \
Class(const Class &) Q_DECL_EQ_DELETE; \
Class & operator=(const Class &) Q_DECL_EQ_DELETE;
而Q_DECL_EQ_DELETE
#ifdef Q_COMPLILER_MEMBERS
#define Q_DECL_EQ_DELETE = delete
#else
#define Q_DECL_EQ_DELETE
#endif
本质就是说 Q_DISABLE_COPY 相当于在申明类中将其拷贝构造函数,复制运算符重载函数后面 = delete;
default 是如下
#ifdef Q_COMPLILER_MEMBERS
#define Q_DECL_EQ_FDEFAULT = default
#else
#define Q_DECL_EQ_FDEFAULT
#endif
delete default 目的
delete 如字面意思是删除的意思, 声明表示该函数不能被调用 ,否则会在编译报出尝试引用已删除的函数。
class Test1
{
Test1& operator=(const Test1&) = delete;
};
Test1 test1;
Test1 test2;
test1 = test2;
编译时候会报C2280: 尝试引用已删除的函数。
回到最初的问题 ,如果想要产生一个类不能被复制,被拷贝一般会将其在私有声明如下。
pirvate:
Q_DISABLE_COPY(类名)
再说 default
字如其意 就是声明调用默认的函数。
因为C++规定,一旦实现了这些函数的自定义版本,则编译器不会再自动生产默认版本。注意只是不自动生成默认版本,当然还是可手动生成默认版本的。当我们自己定义了待参数的构造函数时,我们最好是声明不带参数的版本以完成无参的变量初始化,此时编译是不会再自动提供默认的无参版本了。我们可以通过使用关键字default来控制默认构造函数的生成,显式地指示编译器生成该函数的默认版本。