提问人:Krishna Kanth Yenumula 提问时间:5/23/2021 最后编辑:Krishna Kanth Yenumula 更新时间:5/23/2021 访问量:892
如果我们创建一个用户定义的复制构造函数,为什么编译器不提供默认构造函数?
Why does the compiler not provide default constructor, if we create a user defined copy constructor?
问:
代码是:
#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++标准规则还是有什么原因?
编辑:我知道规则。我只是在寻找原因。
答:
4赞
mediocrevegetable1
5/23/2021
#1
规则是,如果任何构造函数不存在,则会自动创建默认构造函数。从 cppreference:
隐式声明的默认构造函数
如果没有为类类型 (, , 或 ) 提供任何类型的用户声明构造函数,编译器将始终将默认构造函数声明为其类的成员。
struct
class
union
inline public
由于有一个用户声明的构造函数(复制构造函数),因此不提供默认构造函数。
评论
0赞
Krishna Kanth Yenumula
5/23/2021
你是说,这只是C++标准规则??
0赞
mediocrevegetable1
5/23/2021
@KrishnaKanthYenumula是的,看起来就是这样。
0赞
Marc Glisse
5/23/2021
我想只有当存在一个用户声明的构造函数不需要相同类型的预先存在的对象时,才有可能禁用默认的默认构造函数,但是规则变得复杂,最好保持简单。
评论
struct
class
union