不可复制类的原理和实现
2014-08-08 01:16
225 查看
主要原理在三、四两条
一.拷贝构造函数与赋值操作符
class A;
A a;
A b1(a); //拷贝构造函数的实例
A b2 = a; //赋值操作符的实例:
二.拷贝构造函数的应用实例
1.同一类型的对象显示或隐式初始化一个对象,如下:
class A;
A a;
A b(a);
2.作为函数的实参,如下:
void work(const A& a);
3.作为函数的返回值
A& getA() const
{
…
return a;
}
4.初始化顺序容器的元素
5.根据元素初始化式列表初始化数组元素
三.合成的拷贝构造函数和合成的赋值操作符,如下:
如果用户没有显式定义复制构造函数或赋值操作符,编译器将会默认的合成一个复制构造
函数。合成复制构造函数与复制构造函数,或者合成赋值操作符与赋值操作符不同,编译器默认合成的函数的执行行为是"逐个成员初始化",将新对象初始化为原对象的副本。逐个成员初始化不包括static成员,只负责初始化非static成员。
四.如上所述,为了防止复制和赋值,类可以显示声明其拷贝构造函数和赋值操作符为private,如果拷贝构造函数是私有的,将不允许用户代码复制该类类型的对象,编译器将拒绝任何进行复制的尝试。此时,类的友元和成员仍可以复制,当然要想禁止这种情况,也很容易实现。下面是不可复制类的代码:
一.拷贝构造函数与赋值操作符
class A;
A a;
A b1(a); //拷贝构造函数的实例
A b2 = a; //赋值操作符的实例:
二.拷贝构造函数的应用实例
1.同一类型的对象显示或隐式初始化一个对象,如下:
class A;
A a;
A b(a);
2.作为函数的实参,如下:
void work(const A& a);
3.作为函数的返回值
A& getA() const
{
…
return a;
}
4.初始化顺序容器的元素
5.根据元素初始化式列表初始化数组元素
三.合成的拷贝构造函数和合成的赋值操作符,如下:
如果用户没有显式定义复制构造函数或赋值操作符,编译器将会默认的合成一个复制构造
函数。合成复制构造函数与复制构造函数,或者合成赋值操作符与赋值操作符不同,编译器默认合成的函数的执行行为是"逐个成员初始化",将新对象初始化为原对象的副本。逐个成员初始化不包括static成员,只负责初始化非static成员。
四.如上所述,为了防止复制和赋值,类可以显示声明其拷贝构造函数和赋值操作符为private,如果拷贝构造函数是私有的,将不允许用户代码复制该类类型的对象,编译器将拒绝任何进行复制的尝试。此时,类的友元和成员仍可以复制,当然要想禁止这种情况,也很容易实现。下面是不可复制类的代码:
class NonCopyable { protected: NonCopyable(){} ~NonCopyable(){} private: NonCopyable(const NonCopyable &); const NonCopyable& operator=(const NonCopyable&); };
相关文章推荐
- LinuxC/C++编程基础(19) 不可复制类的原理及实现
- mysql主从复制的原理及配置实现
- [Web前端]CSS实现“不可选择,不可复制”面临的问题
- MySQL主从复制原理及配置详细过程以及主从复制集群自动化部署的实现
- MySQL 5.7并行复制实现原理与调优
- MySQL 5.7 并行复制实现原理与调优
- mysql主从复制的原理及配置实现
- Mariadb主主复制原理及实现
- mysql 主从复制实现原理
- mysql 主从复制实现原理
- MySQL 5.7 并行复制实现原理与调优
- Mysql的AB复制(主从复制)原理及实现
- MySQL主从复制的原理及实现过程(mysql-5.5的同步、半步复制过程) 推荐
- java 用FlexPaper+SWFTools实现文章可看不可复制黏贴,转化swf,当文件名中含有多个空格,转化失败的原因及解决办法
- InnoSQL HA Suite的实现原理与配置说明 InnoSQL的VSR功能Virtual Sync Replication MySQL 5.5版本引入了半同步复制(semi-sync replicaiton)的功能 MySQL 5.6支持了crash safe功能
- 图片未经许可,不可引用(图片外链限制PHP实现原理)
- mysql主从复制的原理及配置实现
- Mysql 主从复制实现原理
- 实现剪贴板复制粘贴功能(原理)
- MySQL 5.7并行复制实现原理与调优