构造函数与X() = delete;和private X();
Difference in constructors with X() = delete; and private X();
假设我们有一个类X,我们想要明确禁止,比如标准构造函数。我在头文件中使用了很长时间:
private:
X(); // 1.
所以,构造函数在类之外被禁用,所以对于任何人。但最近我了解到,在c++ 11中,建议如下:
X() = delete; // 2.
两者都能实现我禁止标准构造函数的愿望。
但是它们之间的确切区别是什么呢?为什么c++ 11会推荐最后一个呢?是否还有其他标志、信号设置在2。路吗?
例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
}
生活例子
前者是一种hack。友类可以仍然调用构造函数(并且在链接时您会得到一个错误,除非您实际上也定义了)。
后者实际上阻止了它的自动生成,所以实际上不在那里。
相关文章:
- 运算符C++ "delete []"仅删除 2 个前值
- std::make_shared和protected/private构造函数
- g++用户定义的动态链接库上的全局new和delete运算符
- 为什么"delete"关键字不删除节点?
- "delete"在 C++ 中实际上做了什么?
- 析构函数和'delete'之间的区别
- 如何知道何时调用删除以及何时调用 delete[] C++?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 析构函数中的"delete this"
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 即使在使用 delete[] 后仍保留的元素
- 如果我在下面的代码片段中添加"delete[] d;",为什么我得到零?
- C++原始指针和"delete"
- 为什么 std::vector 使用 std::分配器而不是运算符 new 和 delete?
- 重载 new 和 delete 会导致 valgrind 错误
- 为什么"delete"操作员给我访问权限冲突
- 将复制构造函数设置为private和=delete有什么区别
- 这就是声明构造函数private和声明=delete之间的区别
- 构造函数与X() = delete;和private X();