X() = delete; 构造函数的区别和私人 X();
Difference in constructors with X() = delete; and private X();
让我们假设我们有一个 class X 并且我们希望我们明确禁止,比方说标准构造函数。 Header文件我用了很久:
private:
X(); // 1.
所以,构造函数在 class 之外被禁用,所以对任何人都是如此。但最近我了解到在 C++11 中推荐了以下内容:
X() = delete; // 2.
两者都可以实现我禁止标准构造函数的愿望。
但它们之间的确切区别是什么?为什么 C++11 会推荐最后一个? 2. way中是否还有其他flags、signals设置?
前者有点骇人听闻。一个朋友 class 可以 仍然 调用构造函数(并且你会在 link 时得到一个错误,除非你实际上 定义 也是如此)。
后者实际上阻止了它的自动生成,所以它真的不存在。
示例 1 是在我们使用 C++11 中出现的 = delete
之前的方法。现在我们有了 = delete
这将完全摆脱构造函数。通过将构造函数设为私有,您仍然可以在成员函数中使用该构造函数,如果您尝试使用 = delete
在成员函数中默认对象,这将是编译器错误。
#include <iostream>
class Foo
{
Foo();
public:
static void SomeFunc() { Foo f; }
};
class Bar
{
public:
Bar() = delete;
static void SomeFunc() { Bar b; }
};
int main()
{
Foo::SomeFunc(); // will compile
Bar::SomeFunc(); // compiler error
}
让我们假设我们有一个 class X 并且我们希望我们明确禁止,比方说标准构造函数。 Header文件我用了很久:
private:
X(); // 1.
所以,构造函数在 class 之外被禁用,所以对任何人都是如此。但最近我了解到在 C++11 中推荐了以下内容:
X() = delete; // 2.
两者都可以实现我禁止标准构造函数的愿望。
但它们之间的确切区别是什么?为什么 C++11 会推荐最后一个? 2. way中是否还有其他flags、signals设置?
前者有点骇人听闻。一个朋友 class 可以 仍然 调用构造函数(并且你会在 link 时得到一个错误,除非你实际上 定义 也是如此)。
后者实际上阻止了它的自动生成,所以它真的不存在。
示例 1 是在我们使用 C++11 中出现的 = delete
之前的方法。现在我们有了 = delete
这将完全摆脱构造函数。通过将构造函数设为私有,您仍然可以在成员函数中使用该构造函数,如果您尝试使用 = delete
在成员函数中默认对象,这将是编译器错误。
#include <iostream>
class Foo
{
Foo();
public:
static void SomeFunc() { Foo f; }
};
class Bar
{
public:
Bar() = delete;
static void SomeFunc() { Bar b; }
};
int main()
{
Foo::SomeFunc(); // will compile
Bar::SomeFunc(); // compiler error
}