C++如何禁止掉对象的复制操作

在C++中,为了禁止对象的复制,可以将拷贝构造函数和赋值操作符声明为private且不提供实现,导致在编译或链接时出错。std::iostream类家族便采用了此方法。Boost库提供了boost::noncopyable类来实现这一目的,但不适合多重继承。C++11引入了delete关键字,可以直接禁用默认的拷贝构造函数和赋值操作符,删除后的函数无法被重载。
摘要由CSDN通过智能技术生成

最容易想到的是将拷贝构造函数与赋值函数声明为private。但是,private只是说外部不能直接调用,但是可以间接通过类的成员函数与友元函数对其访问。那么怎么办呢?

----》在类中,允许声明函数,但是,可以不用实现该函数,这是合法的。那么即使是在public中声明函数,但是不实现,那么调用这个函数也是会出错的。


那么好了我们可以特性一起使用,将拷贝构造函数与赋值函数,声明为private,并且不给出实现这样就实现了类复制的完全禁止。

用户代码中的复制尝试将在编译时标记为错误,而成员函数与友元函数中的复制尝试将在链接时出现错误。

上面介绍的这种技术在你熟悉的std::iostream类中已经得到了很好的应用,诸如ios_base、basic_ios和sentry,都采用这样的方式不允许复制操作。


Boost为我们提供了另一种解决方式,这种方式更加完美,因为它可以将链接错误提前到编译时,毕竟早一点发现错误比晚发现要好。

特意声明一个不可复制的类boost::noncopyable

#ifndef BOOST_NONCOPYABLE_HPP_INCLUDED  
#define BOOST_NONCOPYABLE_HPP_INCLUDED  
  
namespace boost { 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值