bitwise copy

有关bitwise copy的理解(个人理解,有错误请指出,谢谢)
如果class没有提供一个explict copy constructor,当class object以"相同class的另一个object"作为初值时,其内部是以所谓的default memberwise initialization手法完成的,也就是把每一个内建的或派生的data member的值,从某一个对象拷贝一份到另外一个对象上。不过它并不会拷贝其中的member class object,而是以递归的方式施行memberwise initialization(递归的意思是不调用member class 的copy constructor去复制member class object的值,而是以member class 内小单元的data进行小规模复制
程序1:
class A
{
 public:
   int i;
   A(){i=0;}
};
int   main() 
{   
    A a;
   cout<<a.i<<endl;
   A a1 = a;//调用内部的default memberwise initialization手法进行复制
   cout<<"--------"<<endl;
   cout<<a1.i<<endl;
   return 0;
}
 
相当于a1.i = a.i;
 
程序2:
但是如果在类的内部有其他类类型的情况就有所不同了:
 
class B  //Without   copy-constructor
{
 public:
      int j;
      char c;
      B(){j=2;c='B';}
};
class A
{
 public:
   int i;
   B b;
   A(){i=0;}
};
int   main() 
{   
   A a;
   cout<<a.i<<endl;
   cout<<a.b.j<<endl;
   cout<<a.b.c<<endl;
   A a1 = a;
   cout<<"--------"<<endl;
   cout<<a1.i<<endl;
   cout<<a1.b.j<<endl;
   cout<<a1.b.c<<endl;
   return 0;
}
 
相当于:
a1.i = a.i;
a1.b.j=a.b.j;
a1.b.c=a.b.c;(对b进行递归复制)
 
输出结果:
0
2
B
-----------
0
2
B
 
 
程序3:
如果类B有explict copy constructor,情况就又不一样了:
class B
{
 public:
      int j;
   char c;
   B(){j=2;c='B';}
   B(const B&){j=3;c='c';cout<<"B::copyconstructor"<<endl;}  //支持
explict copy constructor
};
class A
{
 public:
   int i;
   B b;
   A(){i=0;}
};
int   main() 
{   
   A a;
   cout<<a.i<<endl;
   cout<<a.b.j<<endl;
   cout<<a.b.c<<endl;
   A a1 = a;
   cout<<"--------"<<endl;
   cout<<a1.i<<endl;
   cout<<a1.b.j<<endl;
   cout<<a1.b.c<<endl;
   return 0;
}
 
相当于:
a1.i = a.i;
a1.b = a.b;(调用了复制构造函数,相当于对b进行整体复制)
 
输出结果:
0
2
B
B::copyconstructor
--------
0
3
c
 
 
接下来就是编译器在什么情况下会合成一个copy constructor呢?这就得视该class是否展现"bitwise copy semantics"而定,在inside the c++ object model里说的很清楚,在这里就不说了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值