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

📅  最后修改于: 2021-05-30 02:04:04             🧑  作者: Mango

在C++中,如果我们不定义自己的构造函数,则编译器会创建一个默认构造函数(请参阅此内容)。编译器创建的默认构造函数的主体为空,即,它不会为数据成员分配默认值(在Java,默认构造函数会分配默认值)。

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

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

#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;
}

输出:

COMPILER ERROR: no matching function for call to 'Point::Point()

反向怎么样–当我们编写普通的构造函数而不编写副本构造函数时会发生什么?
反向是不正确的。如果我们不编写自己的副本,则编译器会创建一个副本构造函数。即使我们在类中编写了其他构造函数,编译器也会创建它。例如,下面的程序运行正常。

#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++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”