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*。