为何编译器无法自动生成拷贝函数
2015-10-10 09:19
204 查看
C++编译器一般会为用户自定义类型生成默认拷贝函数。它的行为是逐位复制。逐位复制的意思不是memcpy,而是逐个变量进行复制。
很多书有教导如何禁用掉编译器的拷贝函数:自己声明一个private的拷贝函数。
不过有些时候我们没有故意禁用拷贝函数,却发现编译错误:提示没有相应拷贝函数。这是为什么呢?(一般发生在使用std容器时)
1)先瞄下,有没有不小心声明了个private的拷贝函数
2)逐个检查类的非静态变量,保证都是可以复制的。注意:指针都是可以复制的,引用都是不可复制的,const变量也不可复制!
class Foo1
//不可复制,因为boost::mutex不可复制
{
boost::mutex
mtx;
};
class Foo2 //可复制,因为指针都是可复制的
{
boost::mutex*
mtx;
};
class Foo3 //不可复制,因为引用不可复制
{
int& i;
};
class Foo4 //不可复制,因为const对象不可复制
{
const int i;
};
相应的就知道了如何把一个不可复制的对象转成可以复制的,这一般是为了在std容器里面使用嘿。不过很多时候转换比较麻烦(比如我就是想用mutex),这时可以考虑在容器内放智能指针或指针,如boost::shared_ptr<Foo1>和Foo1*。
相关文章推荐
- 史上最简单的c++四种cast使用教程
- 项目管理之进度悖论
- 使用boost::asio::write时慎用Comp…
- 使用boost条件变量实现消息队列
- 并行计算:近来语言发展的趋势和我…
- 转载:C, Erlang, Java and Go Web…
- c++中实现类似java printStackTrac…
- ASCII字符随机混淆字典的生成
- 端口复用(SO_REUSEADDR)是干啥用的…
- 正确实现和使用assert
- 《C陷阱与缺陷》书评兼感想
- RAII、异常、构造函数是一家人
- 一个笑话和其对开发的启示
- 并发环境下的单态——应用程序级单态…
- 《软件随想录》的随想
- 转载:敏捷估计和规划的12条指导原…
- 《设计模式》旧书重读和总结:创建…
- scrum-and-xp读书笔记
- error C2533: 构造函数不能有返回类型
- shell脚本 整数比较