C++编程中的细节—内容覆盖

一个简单的示例来讲解下这个问题。

[cpp]
  1. class Concrete
  2. {
  3. public:
  4. private:
  5. int val;
  6. char c1;
  7. char c2;
  8. char c3;
  9. };
  10. class Concrete1
  11. {
  12. public:
  13. int val;
  14. char bit1;
  15. };
  16. class Concrete2 :public Concrete1
  17. {
  18. public:
  19. char bit2;
  20. };
  21. class Concrete3 :public Concrete2
  22. {
  23. public:
  24. char bit3;
  25. };
  26. int main()
  27. {
  28. Concrete2 *pc2;
  29. pc2->val = 10;
  30. pc2->bit1 = 'a';
  31. pc2->bit2 = 'b';
  32. Concrete1 * pc1_1, *pc1_2;
  33. pc1_1 = pc2;
  34. *pc1_2 = *pc1_1;
  35. cout<< pc2->bit2<<endl;
  36. return 0;
  37. }
本来bit2的值是b,但是通过赋值后 bit2的内容被pc1_1指向的对象中为分配的内存内容覆盖了(因为编译器有个内存对齐的操作,也就是上面的三个类的大小分别是8bytes,12bytes,16bytes)还是贴张图吧。

当经过这个操作:

[cpp] view plaincopyprint?
  1. pc1_1 = pc2;
  2. *pc1_2 = *pc1_1;

对象pc1_1中未分配的内容就复制给了pc1_2指向的对象。

以后写程序的时候还真得注意这些小细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值