C++如何禁止对象的复制操作
2024-10-18 00:06:41
最容易想到的是将拷贝构造函数与赋值函数声明为private。但是,private只是说外部不能直接调用,但是可以间接通过类的成员函数与友元函数对其访问。那么怎么办呢?
----》在类中,允许声明函数,但是,可以不用实现该函数,这是合法的。那么即使是在public中声明函数,但是不实现,那么调用这个函数也是会出错的。
那么好了我们可以特性一起使用,boost::noncopyable
- #ifndef BOOST_NONCOPYABLE_HPP_INCLUDED
- #define BOOST_NONCOPYABLE_HPP_INCLUDED
- namespace boost {
- // Private copy constructor and copy assignment ensure classes derived from
- // class noncopyable cannot be copied.
- // Contributed by Dave Abrahams
- namespace noncopyable_ // protection from unintended ADL
- {
- class noncopyable
- {
- protected:
- noncopyable() {}
- ~noncopyable() {}
- private: // emphasize the following members are private
- noncopyable( const noncopyable& );
- const noncopyable& operator=( const noncopyable& );
- };
- }
- typedef noncopyable_::noncopyable noncopyable;
- } // namespace boost
- #endif // BOOST_NONCOPYABLE_HPP_INCLUDED
为了禁止拷贝对象,我们只需要让其私有继承自boost::noncopyable,
class student:private boost::noncopyable
{
......
}
当调用到派生类的拷贝构造函数或赋值函数进行复制时,不可避免的要调用基类对应的函数,因为这些操作是private,这样的操作会被编译器拒绝。
需要注意,多重继承有时会使空基类noncopyable优化失效,所以这不适合用于多重继承的情形。
另外,如果只是不想要使用默认的拷贝构造函数或赋值函数,可以使用C++11提供的delete,
class MyClass
{
public:
MyClass()=default;
MyClass(const MyClass& )=delete;
......
}
当然,一旦函数被delete过了,那么重载该函数也是非法的,该函数我们习惯上称为删除函数。
最新文章
- 使用 Json.Net 对Json文本进行 增删改查
- 前端CSS规范整理_转载、、、
- IO(三)----序列流
- 第一个 bat 文件
- SIM卡基础,各管脚意义,封装定义
- struts2 日期标签
- Uva 572 Oil Deposits
- 【USACO】接住苹果
- php学习的第8天
- Java.nio-随机读写汉字
- Android测试(四):Instrumented 单元测试
- 将arguments转换成数组的方法
- WC2019 划水记
- Spark中map与flatMap
- Performance Tuning Guidelines for Windows Server 2012
- 要学习的UML图
- ubuntu 添加CDROM安装源
- (四)SSO之CAS框架单点登录,自定义验证登录方式
- Iterable/Iterator傻傻分不清
- Scrum立会报告+燃尽图(十月二十日总第十一次)