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

📅  最后修改于: 2022-05-13 01:55:10.694000             🧑  作者: Mango

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

构造函数是类的一种特殊类型的成员函数,用于初始化类的对象。在 C++ 中,构造函数在创建对象(类的实例)时自动调用。 C++中的构造函数分为三种类型:默认构造函数、复制构造函数和参数化构造函数。

  • 在 C++ 中,如果我们不定义自己的构造函数,编译器会创建一个默认构造函数。在 C++ 中,编译器创建的默认构造函数有一个空主体,即它不为数据成员分配默认值。但是,在Java中,默认构造函数分配默认值。
  • 如果我们不编写自己的复制构造函数,编译器也会创建一个复制构造函数。与默认构造函数不同,编译器创建的复制构造函数的主体不是空的,它将传递对象的所有数据成员复制到正在创建的对象中。

当我们只编写一个复制构造函数时会发生什么——编译器会创建一个默认构造函数吗?如果我们编写任何构造函数,即使它是复制构造函数,编译器也不会创建默认构造函数。例如,以下程序无法编译。

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


CPP
// CPP Program to demonstrate what happens when we write a
// normal constructor and don't write a copy constructor
#include 
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;
}


输出:

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

当我们编写普通构造函数而不编写复制构造函数时会发生什么?

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

CPP

// CPP Program to demonstrate what happens when we write a
// normal constructor and don't write a copy constructor
#include 
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

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

必读:

  • 我们什么时候应该编写自己的复制构造函数?
  • 当我们编写自己的构造函数时,C++ 编译器会创建默认构造函数吗?