如果我们创建一个用户定义的复制构造函数,为什么编译器不提供默认构造函数?

Why does the compiler not provide default constructor, if we create a user defined copy constructor?

提问人:Krishna Kanth Yenumula 提问时间:5/23/2021 最后编辑:Krishna Kanth Yenumula 更新时间:5/23/2021 访问量:892

问:

代码是:

#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++标准规则还是有什么原因?

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

C++ 复制构造函数 default-constructor

评论

0赞 Retired Ninja 5/23/2021
stackoverflow.com/questions/563221/......
0赞 Kitswas 5/23/2021
如果无法创建类类型(或)的实例,则该类类型(或)几乎毫无意义。因此,如果编译器找不到默认构造函数,则会提供默认构造函数。如果创建构造函数,则有一种方法可以创建对象。因此,在这种情况下,编译器不执行任何操作。structclassunion
0赞 Krishna Kanth Yenumula 5/23/2021
请提供投反对票的理由。我知道规则。我正在寻找原因,为什么没有提供默认构造函数。
0赞 StoryTeller - Unslander Monica 5/23/2021
复制对象需要特殊的逻辑(据编译器所知,因为你提供了一些手工制作的实现)。这与你提供一些其他参数化构造函数没有什么不同,你做了一些特别的事情。因此,编译器不应该假设它只能为您生成默认的 c'tor。它不知道你需要什么,它的实现可能完全不符合你的需求。所以它不提供一个(除非明确要求)。

答:

4赞 mediocrevegetable1 5/23/2021 #1

规则是,如果任何构造函数不存在,则会自动创建默认构造函数。从 cppreference

隐式声明的默认构造函数

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

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

评论

0赞 Krishna Kanth Yenumula 5/23/2021
你是说,这只是C++标准规则??
0赞 mediocrevegetable1 5/23/2021
@KrishnaKanthYenumula是的,看起来就是这样。
0赞 Marc Glisse 5/23/2021
我想只有当存在一个用户声明的构造函数不需要相同类型的预先存在的对象时,才有可能禁用默认的默认构造函数,但是规则变得复杂,最好保持简单。