【发布时间】: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++ 标准规则还是有什么原因??
编辑:我知道规则。我只是在寻找原因。
【问题讨论】:
-
一个类类型(
struct、class或union)如果不能创建它的实例,那么它大多是没有意义的。因此,如果没有找到,编译器会提供一个默认构造函数。如果你创建了一个构造函数,就有一种方法可以创建一个对象。所以编译器在这种情况下什么都不做。 -
请提供拒绝投票的理由。我知道规则。我正在寻找原因,为什么没有提供默认构造函数。
-
复制您的对象需要特殊的逻辑(据编译器所知,因为您提供了一些手工实现)。这与如果您提供一些其他参数化构造函数没有什么不同,您会做一些特别的事情。所以编译器不应该假设它可以为你生成默认的 c'tor。它不知道您需要什么,而且它的实现对于您的需求可能完全不合理。所以它不提供(除非明确要求)。
标签: c++ copy-constructor default-constructor