原文: https://www.programiz.com/cpp-programming/constructors

在本文中,您将学习 C++ 中的构造器。 您将学习什么是构造器,如何创建它以及 C++ 中的构造器类型。

构造器是成员函数的一种特殊类型,它在创建对象时自动对其进行初始化。

编译器通过其名称和返回类型将给定的成员函数标识为构造器。

构造器与类具有相同的名称,并且没有任何返回类型。 同样,构造器始终是公共的。

  1. ... .. ...
  2. class temporary
  3. {
  4. private:
  5. int x;
  6. float y;
  7. public:
  8. // Constructor
  9. temporary(): x(5), y(5.5)
  10. {
  11. // Body of constructor
  12. }
  13. ... .. ...
  14. };
  15. int main()
  16. {
  17. Temporary t1;
  18. ... .. ...
  19. }

上面的程序显示了定义的构造器,没有返回类型,并且名称与类相同。


构造器如何工作?

在上面的伪代码中,temporary()是构造器。

创建类temporary的对象时,将自动调用构造器,并且x初始化为 5,y初始化为 5.5。

您还可以按如下所示初始化构造器体内的数据成员。 但是,这种方法不是优选的。

  1. temporary()
  2. {
  3. x = 5;
  4. y = 5.5;
  5. }
  6. // This method is not preferred.

在 C++ 中使用构造器

假设您正在处理 100 个Person对象,并且数据成员age的默认值为 0。手动初始化所有对象将是一项非常繁琐的任务。

相反,您可以定义一个将age初始化为 0 的构造器。然后,您要做的就是创建Person对象,该构造器将自动初始化age

这些情况在处理对象数组时经常出现。

另外,如果要在创建对象后立即执行一些代码,可以将代码放在构造器的主体内。


示例 1:C++ 中的构造器

计算并显示矩形的面积。

  1. #include <iostream>
  2. using namespace std;
  3. class Area
  4. {
  5. private:
  6. int length;
  7. int breadth;
  8. public:
  9. // Constructor
  10. Area(): length(5), breadth(2){ }
  11. void GetLength()
  12. {
  13. cout << "Enter length and breadth respectively: ";
  14. cin >> length >> breadth;
  15. }
  16. int AreaCalculation() { return (length * breadth); }
  17. void DisplayArea(int temp)
  18. {
  19. cout << "Area: " << temp;
  20. }
  21. };
  22. int main()
  23. {
  24. Area A1, A2;
  25. int temp;
  26. A1.GetLength();
  27. temp = A1.AreaCalculation();
  28. A1.DisplayArea(temp);
  29. cout << endl << "Default Area when value is not taken from user" << endl;
  30. temp = A2.AreaCalculation();
  31. A2.DisplayArea(temp);
  32. return 0;
  33. }

在该程序中,创建了Area类来处理与区域相关的功能。 它具有两个数据成员lengthwidth

定义了一个构造器,该构造器将length初始化为 5,将width初始化为 2。

我们还具有三个附加的成员函数GetLength(), AreaCalculation() and DisplayArea(),以从用户处获取长度,计算面积并分别显示面积。

当创建对象A1A2时,由于构造器的缘故,两个对象的lengthwidth分别初始化为 5 和 2。

然后,调用成员函数GetLength(),该函数从对象获取对象A1lengthwidth的值。 这改变了对象A1的长度和宽度。

然后,通过调用AreaCalculation()函数计算对象A1的区域并将其存储在变量temp中,最后将其显示。

对于对象A2,没有要求用户提供任何数据。 因此,lengthwidth分别保持为 5 和 2。

然后,计算并显示A2的面积为 10。

输出

  1. Enter length and breadth respectively: 6
  2. 7
  3. Area: 42
  4. Default Area when value is not taken from user
  5. Area: 10

构造器重载

构造器可以类似于函数重载的方式重载。

重载的构造器具有相同的名称(类的名称),但参数数量不同。

根据传递的参数的数量和类型,将调用特定的构造器。

由于存在多个构造器,因此在创建对象时也应传递该构造器的参数。


示例 2:构造器重载

  1. // Source Code to demonstrate the working of overloaded constructors
  2. #include <iostream>
  3. using namespace std;
  4. class Area
  5. {
  6. private:
  7. int length;
  8. int breadth;
  9. public:
  10. // Constructor with no arguments
  11. Area(): length(5), breadth(2) { }
  12. // Constructor with two arguments
  13. Area(int l, int b): length(l), breadth(b){ }
  14. void GetLength()
  15. {
  16. cout << "Enter length and breadth respectively: ";
  17. cin >> length >> breadth;
  18. }
  19. int AreaCalculation() { return length * breadth; }
  20. void DisplayArea(int temp)
  21. {
  22. cout << "Area: " << temp << endl;
  23. }
  24. };
  25. int main()
  26. {
  27. Area A1, A2(2, 1);
  28. int temp;
  29. cout << "Default Area when no argument is passed." << endl;
  30. temp = A1.AreaCalculation();
  31. A1.DisplayArea(temp);
  32. cout << "Area when (2,1) is passed as argument." << endl;
  33. temp = A2.AreaCalculation();
  34. A2.DisplayArea(temp);
  35. return 0;
  36. }

对于对象A1,在创建对象时不传递任何参数。

因此,将调用不带参数的构造器,该构造器会将length初始化为 5,将width初始化为 2。因此,对象A1的面积将为 10。

对于对象A2,在创建对象时将 2 和 1 作为参数传递。

因此,将调用具有两个参数的构造器,该构造器将length初始化为l(在这种情况下为 2),并将breadth初始化为b(1 在这种情况下)。 因此,对象A2的面积将为 2。

输出

  1. Default Area when no argument is passed.
  2. Area: 10
  3. Area when (2,1) is passed as argument.
  4. Area: 2

默认复制构造器

一个对象可以用另一个相同类型的对象初始化。 这与将一个类的内容复制到另一个类相同。

在上述程序中,如果要初始化对象A3使其包含与A2相同的值,则可以执行以下操作:

  1. ....
  2. int main()
  3. {
  4. Area A1, A2(2, 1);
  5. // Copies the content of A2 to A3
  6. Area A3(A2);
  7. OR,
  8. Area A3 = A2;
  9. }

您可能会认为,您需要创建一个新的构造器来执行此任务。 但是,不需要其他构造器。 这是因为默认情况下,复制构造器已内置到所有类中。