如何删除默认构造函数?

Yuk*_*awa 39 c++

有时我不想提供默认构造函数,也不希望编译器为我的类提供系统默认构造函数.在C++ 11中,我可以这样做:

class MyClass 
{ 
  public: 
    MyClass() = delete; 
};
Run Code Online (Sandbox Code Playgroud)

但目前我的讲师不允许我在我的任务中这样做.问题是:在C++ 11之前,有没有办法告诉编译器隐式提供默认构造函数?

vid*_*dit 47

我会说把它私有化......就像

class MyClass
{
private:
    MyClass();
}
Run Code Online (Sandbox Code Playgroud)

并且没有人(来自类本身或朋友类之外)将能够调用默认构造函数.此外,您将有三个使用该类的选项:要么提供参数化构造函数,要么将其用作实用程序类(仅具有静态函数)或在友元类中为此类型创建工厂.

  • Scott Meyers 在他的《Effective Modern C++》一书中写道,您也可以不定义私有构造函数。它将帮助您保护默认构造函数不被友元类调用(将引发链接错误)。 (3认同)

Edw*_*nge 13

当然.定义您自己的构造函数,默认或其他.

您也可以将其声明为私有,以便无法调用.遗憾的是,除非您提供静态函数来调用它,否则会使您的类完全无法使用.

  • 仅当您将 _all_ 构造函数设为私有时才无法使用。 (2认同)

faf*_*frd 10

从 c++11 开始,您可以设置 constructor = delete。这与 c++11 的大括号初始化语法结合使用很有用{}

例如:

struct foo {
  int a;
  foo() = delete;
};

foo f{}; // error use of deleted function foo::foo()
foo f{3}; // OK
Run Code Online (Sandbox Code Playgroud)

https://en.cppreference.com/w/cpp/language/default_constructor#Deleted_implicitly-declared_default_constructor

  • 它也使用 clang 进行编译:https://coliru.stacked-crooked.com/a/94538c19c9fb76a3。该解决方案的问题在于它取决于编译器。 (3认同)
  • 您错了。`foo f{}` 编译成功:https://coliru.stacked-crooked.com/a/03c3c56e3d143aa4 (2认同)