如何删除默认构造函数?

时间:2012-05-06 21:21:28

标签: c++

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

class MyClass 
{ 
  public: 
    MyClass() = delete; 
};

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

4 个答案:

答案 0 :(得分:45)

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

class MyClass
{
private:
    MyClass();
}

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

答案 1 :(得分:13)

不确定。定义您自己的构造函数,默认或其他。

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

答案 2 :(得分:0)

除了将默认构造函数声明为私有之外,当有人尝试调用它时,您还可能引发异常。

class MyClass
{
  private:
    MyClass() 
    {
      throw [some exception];
    };
}

答案 3 :(得分:0)

从c ++ 11开始,您可以设置构造函数= delete。结合c ++ 11的大括号初始化语法{}很有用。

例如:

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

foo f{}; // error use of deleted function foo::foo()
foo f{3}; // OK

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