当前位置:   article > 正文

构造函数_myclass& operator=(const myclass&x) {cout<<3; retu

myclass& operator=(const myclass&x) {cout<<3; return*this;}

以下代码输出是什么?

  1. #include<iostream>
  2. using namespace std;
  3. class MyClass
  4. {
  5. public:
  6. MyClass(int i = 0)
  7. {
  8. cout << i;
  9. }
  10. MyClass(const MyClass &x)
  11. {
  12. cout << 2;
  13. }
  14. MyClass &operator=(const MyClass &x)
  15. {
  16. cout << 3;
  17. return *this;
  18. }
  19. ~MyClass()
  20. {
  21. cout << 4;
  22. }
  23. };
  24. int main()
  25. {
  26. MyClass obj1(1), obj2(2);
  27. MyClass obj3 = obj1;
  28. return 0;
  29. }


答案:

122444


解题思路:

关键是区分 浅/深拷贝操作 和 赋值操作: 
没有重载=之前: 
A a ; 
A b; 
a = b; 
这里是赋值操作。 
A a; 
A b = a;  
这里是浅拷贝操作(简单的值拷贝调用拷贝构造函数)。 

重载 = 之后: 
A a ; 
A b; 
a = b; 
这里是深拷贝操作(通常重载赋值运算符函数中进行深拷贝操作(new分配新内存地址,进行拷贝))。 
A a; 
A b = a;  
这里还是浅拷贝操作(调用拷贝构造函数)。 

所以 MyClass obj3 = obj1; 调用的是拷贝构造函数,而没调用符号重载函数。 
如果写成 MyClass obj3; obj3 = obj1; 输出的结果就是 1203444(调用默认构造函数时为0)

引申:构造函数自己传值进去就为自己的值(不会赋值为0),赋值为0是用于默认构造函数。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/714930
推荐阅读
相关标签
  

闽ICP备14008679号