您的位置:首页 > 其它

为何编译器无法自动生成拷贝函数

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

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: