禁止类的实例的复制拷贝(C++)
在C++中定一个类的时候,如果不明确定义拷贝(复制)构造函数和拷贝(复制)赋值操作符,编译器会自动生成这两个函数。
例如:
class empty_class {};
这样一个简单的 “空” 类,编译器在处理这段代码时会自动加上拷贝构造函数和拷贝赋值操作符,效果实际上相当于:
class empty_class
{
public:
empty_class (const empty_class &) {...}
empty_class & operator= (const empty_class &) {...}
};
一般情况下这是有用的,比如可以自动支持 swap()、符合容器的拷贝语义、可以放入标准容器处理,但有的时候我们不需要类的拷贝语义,希望禁止拷贝类的实例。
这是一个很经典的 C++惯用法,原理很好理解,只需要私有化拷贝构造函数和拷贝赋值操作符即可,手写代码也很简单例如:
class do_not_copy
{
private:
do_not_copy (const do_not_copy &); //私有化,声明即可,不需要实现代码
do_not_copy & operator=(const do_not_copy &); //私有化,声明即可,不需要实现代码
};
但如果程序中有大量这样的类,重复这样的代码是相当乏味的,而且代码出现的次数越多越容易增大手写出错的几率。虽然也可以用带参数的宏来减少重复,但解决方案不够优雅。
我们可以自己实现一个类 noncopyable,我们自定义的类继承 noncopyable,从而不能进行拷贝和赋值:
class donot copy : noncopyable
{...};
noncopyable的实现原理很简单,代码很少:
class noncopyable
{
protected:
noncopyable() {}
~noncopyable() {}
private:
noncopyable( const noncopyable& ); //私有化拷贝构造和拷贝赋值
const noncopyable& operator=( const noncopyable & );
};
因此,当我们的自定义类是 noncopyable的子类时就会自动私有化父类noncopyable的拷贝构造函数,从而禁止用户从外部访问拷贝构造函数和拷贝赋值函数。
如果使用c++标准的 default 和delete关键字,则 noncopyable 可以更清晰地实现如下:
class noncopyable
{
protected:
noncopyable() =default; //默认的构造和析构是保护的
~noncopyable()=default; //使用默认实现
//使用delete关键字禁用拷贝构造和拷贝赋值
noncopyable( const noncopyable& )=delete;
const noncopyable& operator=( const noncopyable& )= delete;
};
测试:
int main(void)
{
empty_class em_c1;
empty_class em_c2(em_c1);
empty_class em_c3 = em_c1;
noncopy_class noc_c1;
//error C2248: 'noncopy_class::noncopy_class' : cannot access private member declared in class 'noncopy_class'
//noncopy_class noc_c2(noc_c1) ;
//noncopy_class noc_c3 = noc_c1;
do_not_copy_class d1;
//error C2248: 'boost::noncopyable_::noncopyable::noncopyable' : cannot access private member declared in class 'boost::noncopyable_::noncopyable'
//do_not_copy_class d2(d1);
//do_not_copy_class d3 = d1;
//只要有可能就使用boost::noncopyable,它明确无误地表达了类设计者的意图;
//对用户更加友好,而且与其它的boost库配合的也好
cin.get();
return 0;
}
boost库给我们提供了一个这样的类:
#include <boost/noncopyable.hpp>
使用
class A : public boost::noncopyable {
};
该文章会更新,欢迎大家批评指正。文章来源:https://www.toymoban.com/news/detail-491884.html
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器文章来源地址https://www.toymoban.com/news/detail-491884.html
到了这里,关于禁止类的实例的复制拷贝(C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!