【问题标题】:Why does the compiler not provide default constructor, if we create a user defined copy constructor?如果我们创建用户定义的复制构造函数,为什么编译器不提供默认构造函数?
【发布时间】:2021-08-11 20:55:07
【问题描述】:

代码是:

#include <iostream>
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()

当我们创建自己的复制构造函数时,编译器不会创建默认构造函数。为什么?
这只是 C++ 标准规则还是有什么原因??

编辑:我知道规则。我只是在寻找原因。

【问题讨论】:

  • 一个类类型(structclassunion)如果不能创建它的实例,那么它大多是没有意义的。因此,如果没有找到,编译器会提供一个默认构造函数。如果你创建了一个构造函数,就有一种方法可以创建一个对象。所以编译器在这种情况下什么都不做。
  • 请提供拒绝投票的理由。我知道规则。我正在寻找原因,为什么没有提供默认构造函数。
  • 复制您的对象需要特殊的逻辑(据编译器所知,因为您提供了一些手工实现)。这与如果您提供一些其他参数化构造函数没有什么不同,您会做一些特别的事情。所以编译器不应该假设它可以为你生成默认的 c'tor。它不知道您需要什么,而且它的实现对于您的需求可能完全不合理。所以它不提供(除非明确要求)。

标签: c++ copy-constructor default-constructor


【解决方案1】:

规则是,如果 any 构造函数不存在,则自动生成默认构造函数。来自cppreference

隐式声明的默认构造函数

如果没有为类类型(structclassunion)提供任何类型的用户声明构造函数,编译器将始终将默认构造函数声明为其类的 inline public 成员.

由于有一个用户声明的构造函数(复制构造函数),因此没有提供默认构造函数。

【讨论】:

  • 你是说,这只是C++标准规则??
  • @KrishnaKanthYenumula 是的,看起来就是这样。
  • 我想只有当存在一个用户声明的构造函数不需要相同类型的预先存在的对象时才能禁用默认的默认构造函数,但是规则变得复杂,它最好保持简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 2022-12-06
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多