当我们定义一个C++类,如果没有为其定义=运算符重载,那么编译器就为其定义默认的=运算符重载。即默认拷贝。前阵子一个朋友问我:默认的=运算符重载是否就是直接的内存拷贝?
由于自己功底有限,没有考虑过这个问题,所以不敢立刻回答。虽然我们常说浅复制和深复制,但我确实没有想过默认拷贝函数是否只是简单的拷贝内存内容。
当然,事实胜于雄辩,编个代码试试就说明了问题。其实C++的默认=运算符重载是“逐个调用成员变量的=运算符重载”。而不该理解为简单的内存拷贝。
以下代码试图说明这个问题:
屏幕输出了 Call B operator= ,说明了这并不是简单的内存拷贝。
虽然这些都是很细节的问题,不过还是提醒自己要多多积累,毕竟这样的细节在工作中可能引起不容易察觉的bug。
由于自己功底有限,没有考虑过这个问题,所以不敢立刻回答。虽然我们常说浅复制和深复制,但我确实没有想过默认拷贝函数是否只是简单的拷贝内存内容。
当然,事实胜于雄辩,编个代码试试就说明了问题。其实C++的默认=运算符重载是“逐个调用成员变量的=运算符重载”。而不该理解为简单的内存拷贝。
以下代码试图说明这个问题:
- #include <iostream>
- using namespace std;
- class B
- {
- public :
- // 为B写个=运算符重载函数
- B& operator=( const B& )
- {
- cout << "Call B operator=" << endl;
- }
- };
- // 定义类A,但不为其编写=运算符重载
- class A
- {
- public :
- B b;
- };
- int main()
- {
- A a1;
- A a2;
- a1 = a2; // 将a2复制给a1,观察输出,证明调用了类B的=运算符重载
- getchar();
- return 0;
- }
屏幕输出了 Call B operator= ,说明了这并不是简单的内存拷贝。
虽然这些都是很细节的问题,不过还是提醒自己要多多积累,毕竟这样的细节在工作中可能引起不容易察觉的bug。