boost noncopyable实现禁止类拷贝
2016-03-31 14:58
253 查看
最近使用boost noncopyable一点思考。
上面拷贝构造函数和赋值构造函数都声明为private,这样不论什么派生方式,子类对此都是无权访问的,从而达到禁止拷贝的目的。
对于构造函数
为什么声明成protected呢?
首先肯定不能为private,不然无法构造子类实例。
如果为public,那么外部是可以创建noncopyable这么一个实例的,可是这个实例是完全没有意义的,该类只有在被继承之后才有意义。
所以此处声明为protected是非常恰当合适的,既保证外部无法直接构造一个无意义的noncopyable实例,又不影响构造子类实例。
分析可知,noncopyable act as 实现继承基类。
另外还有很常见的做法就是自己实现,即不通过noncopyable继承获取禁止拷贝的功能,而是将类的拷贝构造和赋值构造函数声明为private。
这两个方法还有个细微的差别,noncopyable 继承的子类对拷贝构造函数,赋值拷贝函数是没有访问权限的;而由类自身来实现禁止拷贝方法,类成员还是可以访问得到这两个函数的。
对于后一种方法,这两个函数只声明不去实现,即使类成员有权限访问的到(看似似乎要突破禁止拷贝的防线了),但是也会因为链接找不到实现而报错。
class noncopyable { protected: noncopyable() {} ~noncopyable() {} private: // emphasize the following members are private noncopyable( const noncopyable& ); const noncopyable& operator=( const noncopyable& ); };
上面拷贝构造函数和赋值构造函数都声明为private,这样不论什么派生方式,子类对此都是无权访问的,从而达到禁止拷贝的目的。
对于构造函数
为什么声明成protected呢?
首先肯定不能为private,不然无法构造子类实例。
如果为public,那么外部是可以创建noncopyable这么一个实例的,可是这个实例是完全没有意义的,该类只有在被继承之后才有意义。
所以此处声明为protected是非常恰当合适的,既保证外部无法直接构造一个无意义的noncopyable实例,又不影响构造子类实例。
分析可知,noncopyable act as 实现继承基类。
另外还有很常见的做法就是自己实现,即不通过noncopyable继承获取禁止拷贝的功能,而是将类的拷贝构造和赋值构造函数声明为private。
这两个方法还有个细微的差别,noncopyable 继承的子类对拷贝构造函数,赋值拷贝函数是没有访问权限的;而由类自身来实现禁止拷贝方法,类成员还是可以访问得到这两个函数的。
对于后一种方法,这两个函数只声明不去实现,即使类成员有权限访问的到(看似似乎要突破禁止拷贝的防线了),但是也会因为链接找不到实现而报错。
相关文章推荐
- 构建高并发高可用的电商平台架构实践
- tomcat study 第十一章
- Linux下安装Nginx详解,含图
- 【11】Linux-字符驱动编程模型
- OpenCV 基本模块
- ubuntu安装apache2
- mysql的一些操作(linux+windows)持续更新
- Linux wc 命令,查看行数,字节数
- Linux安装eclipse并在桌面图标
- SURF局部特征(OpenCV+GPU)
- linux下搭建mysql主从
- 如何在Linux中用命令行工具管理KVM虚拟环境
- openssl-1.0.1s - libssl 移植到ARM Linux 板子是2416
- 如何更改linux文件的拥有者及用户组(chown和chgrp)
- centos 安装JDK1.7
- 使用xshell链接本地虚拟机中的Linux
- Linux的前世今生
- PopupWindow的使用
- Linux的前世今生
- about always-populate-raw-post-data must be set -1 的问题: