C++ 不允许在C++;
我试图在C++中创建一个类,禁止使用默认构造函数。 然而,我认为我失败了,或者我不明白幕后发生了什么。以下是我到目前为止的情况:C++ 不允许在C++;,c++,c++11,C++,C++11,我试图在C++中创建一个类,禁止使用默认构造函数。 然而,我认为我失败了,或者我不明白幕后发生了什么。以下是我到目前为止的情况: class Point { public: float x; float y; Point(float newX, float newY); //Definition is irrelevant Point() = delete; //Default or "empty" constructor is f
class Point {
public:
float x;
float y;
Point(float newX, float newY); //Definition is irrelevant
Point() = delete; //Default or "empty" constructor is forbidden, so deleted
}
/* ... */
int main(void)
{
Point a(1, 2); //Ok, should be available
Point b; //Ok, does not compile
Point c(); //Not ok, it does compile :(
}
我的预期行为是不编译c点。我很感激能帮助我产生这样的行为,或者如果不可能的话,解释一下为什么会这样
提前谢谢你正在发生的是一个令人烦恼的问题。您不是在声明一个对象,而是一个名为c、返回类型为class
Point
的函数
声明任何构造函数都会阻止编译器生成默认构造函数,所以使用
=delete
的声明是超流的
聚合初始化 如果您知道顺序,您甚至不需要构造函数:
Point p{newX, newY};
会很好用的
统一初始化语法 将来,为了避免这种情况,请使用
{}
:
Point p{}; //default constructs
线路
Point c(); //Not ok, it does compile :(
不会解释为创建Point类型的对象c,而是解释为声明一个新函数c,该函数返回一个点且不带任何参数。看这里:
也不需要这一行:
Point() = delete; //Default or "empty" constructor is forbidden, so deleted
如果您声明了任何构造函数,那么默认构造函数将被覆盖。它确实可以编译,但这只是因为它不是您认为的那样。您已正确删除默认构造函数。实际上已经声明了一个非默认构造函数,阻止类成为默认可构造的:
struct Foo {
Foo(int);
}
Foo x; // wont compile
将默认构造函数声明为已删除是一种良好的做法,因为它明确指出默认构造函数是故意被忽略的
为什么要编译
Foo x();
声明一个返回
Foo
的函数。这是众所周知的最令人烦恼的解析 我在前面的帖子中得到了答案:。请注意,问题中发布的代码已更新,以显示如何执行此操作。c
不是对象。所以默认的c'tor不会被调用,不用担心。