C++的=运算符重载并非简单内存拷贝

    当我们定义一个C++类,如果没有为其定义=运算符重载,那么编译器就为其定义默认的=运算符重载。即默认拷贝。前阵子一个朋友问我:默认的=运算符重载是否就是直接的内存拷贝?
   由于自己功底有限,没有考虑过这个问题,所以不敢立刻回答。虽然我们常说浅复制和深复制,但我确实没有想过默认拷贝函数是否只是简单的拷贝内存内容。
   当然,事实胜于雄辩,编个代码试试就说明了问题。其实C++的默认=运算符重载是“逐个调用成员变量的=运算符重载”。而不该理解为简单的内存拷贝。
   以下代码试图说明这个问题:

  1. #include <iostream>
  2. using namespace std;

  3. class B
  4. {
  5. public :
  6.     // 为B写个=运算符重载函数
  7.     B& operator=( const B& )
  8.     {
  9.         cout << "Call B operator=" << endl;
  10.     }
  11. };
  12. // 定义类A,但不为其编写=运算符重载
  13. class A
  14. {
  15. public :
  16.     B b;
  17. };

  18. int main()
  19. {
  20.     A a1;
  21.     A a2;
  22.     a1 = a2; // 将a2复制给a1,观察输出,证明调用了类B的=运算符重载
  23.     getchar();
  24.     return 0;
  25. }


    屏幕输出了 Call B operator= ,说明了这并不是简单的内存拷贝。
    虽然这些都是很细节的问题,不过还是提醒自己要多多积累,毕竟这样的细节在工作中可能引起不容易察觉的bug。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值