什么时候没有调用c构造函数?

前端之家收集整理的这篇文章主要介绍了什么时候没有调用c构造函数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一种情况,似乎没有调用构造函数
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main ()
  6. {
  7. class yoyo
  8. {
  9. public:
  10. int i;
  11. yoyo()
  12. {
  13. i = 0;
  14. cout << "defaultly initialized to 0" << endl;
  15. }
  16. yoyo (int j) : i(j)
  17. {
  18. cout << "initialized to " << j << endl;
  19. }
  20. };
  21.  
  22. int i;
  23.  
  24. yoyo a;
  25. cout << "Hello1,i: " << a.i << endl;
  26.  
  27. yoyo b(5);
  28. cout << "Hello2,i: " << b.i << endl;
  29.  
  30. yoyo c = b; /* 1 */
  31. cout << "Hello3,i: " << c.i << endl;
  32.  
  33. return 0;
  34. }

输出是:

  1. defaultly initialized to 0
  2. Hello1,i: 0
  3. initialized to 5
  4. Hello2,i: 5
  5. Hello3,i: 5

(注意:Hello2和Hello3之间没有任何内容)

如果我将程序更改为如下所示:

  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main ()
  6. {
  7. class yoyo
  8. {
  9. public:
  10. int i;
  11. yoyo()
  12. {
  13. i = 0;
  14. cout << "defaultly initialized to 0" << endl;
  15. }
  16. yoyo (int j) : i(j)
  17. {
  18. cout << "initialized to " << j << endl;
  19. }
  20. };
  21.  
  22. int i;
  23.  
  24. yoyo a;
  25. cout << "Hello1,i: " << b.i << endl;
  26.  
  27. yoyo c; c = b; /* 1 */
  28. cout << "Hello3,i: " << c.i << endl;
  29.  
  30. return 0;
  31. }

(唯一的区别在于他标有/ * 1 * /的行)

现在的输出是:

  1. defaultly initialized to 0
  2. Hello1,i: 5
  3. defaultly initialized to 0
  4. Hello3,i: 5

现在Hello2和Hello3之间有一个构造函数调用.我的问题是,为什么在第一种情况下没有(可见)构造函数调用

解决方法

如果是
  1. yoyo c = b;

它被称为copy constructor.

而在这种情况下

  1. yoyo c; c = b;

这是被称为copy assignment的操作符.

如果您不提供其中任何一个,编译器将为您生成默认版本.

如果要创建自己的复制构造函数,它可能如下所示:

  1. yoyo(const yoyo& other)
  2. : i(other.i)
  3. { std::cout << "copy constructor initialized\n"; }

复制赋值运算符如下所示:

  1. yoyo& operator=(const yoyo& other)
  2. {
  3. i = other.i;
  4. return *this;
  5. }

当然,它们都在类定义中定义.

猜你在找的C&C++相关文章