何时在C++中创建默认构造函数和复制构造函数?

何时在C++中创建默认构造函数和复制构造函数?

构造函数是一个特殊的类成员函数,用于初始化类的对象。在C++中,当对象(类的实例)创建时,构造函数会自动调用。C++中有3种构造函数类型

  • 默认构造函数(Default Constructor)
  • 复制构造函数(Copy constructor)
  • 参数化构造函数(Parameterized Constructor)

在C++中,如果我们没有定义自己的构造函数,编译器会创建一个默认的构造函数。在C++中,编译器创建的默认构造函数具有空体,即它不分配默认值给数据成员。但是,在Java中,默认构造函数会分配默认值。

语法:

Class_name()

可以通过参数化构造函数的形式传递参数到构造函数中。通常,这些参数有助于在创建对象时初始化它们。要创建参数化构造函数,请像任何其他函数一样添加参数。在定义构造函数的主体时,使用参数来初始化对象。

语法:

Class_name(Parameters)

如果我们没有编写自己的复制构造函数,编译器也会创建一个复制构造函数。与默认构造函数不同,编译器创建的复制构造函数的主体不是空的,它将所有传递对象的数据成员复制到正在创建的对象。

语法:

Class_name(const Class_name & object)

当我们仅编写复制构造函数时会发生什么—编译器是否会创建默认构造函数?

编译器不会创建默认构造函数,即使我们编写的是复制构造函数。例如,以下程序将无法编译。

// C++ Program to demonstrate what
// happens when we write
// only a copy constructor
#include <iostream>
using namespace std;
  
class Point {
    int x, y;
  
public:
    Point(const Point& p) // Copy Constructor
    {
        x = p.x;
        y = p.y;
    }
};
  
int main()
{
    Point p1;
    // Compiler Error
    Point p2 = p1;
    return 0;
}  

输出:

Compiler Error: no matching function for call to 'Point::Point()

如果我们没有编写复制构造函数,编译器会创建复制构造函数。即使我们在类中编写了其他构造函数,编译器也会创建它。例如,以下程序可以正常工作。

// CPP Program to demonstrate what happens when we write a
// normal constructor and don't write a copy constructor
#include <iostream>
using namespace std;
  
class Point {
    int x, y;
  
public:
    Point(int i, int j)
    {
        x = 10;
        y = 20;
    }
    int getX() { return x; }
    int getY() { return y; }
};
  
int main()
{
    Point p1 (10, 20);
    Point p2 = p1; // This compiles fine
    cout << "x = " << p2.getX() << " y = " << p2.getY();
    return 0;
}  

输出

x = 10 y = 20

因此,只有当我们具有指针或运行时资源分配(如文件句柄、网络连接等)时,才需要编写复制构造函数。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程