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

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

   



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值