49

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

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

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

4

4 回答 4

50

我会说让它私有..像

class MyClass
{
private:
    MyClass();
}

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

于 2012-05-06T21:22:45.800 回答
14

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

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

于 2012-05-06T21:23:02.290 回答
10

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

例如:

struct foo {
  int a;

  foo() = delete;
  foo(int _a) {
    // working constructor w/ argument
  }
};

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

于 2019-12-30T18:59:00.497 回答
1

除了将默认构造函数声明为私有之外,您还可以在有人尝试调用它时抛出异常。

class MyClass
{
  private:
    MyClass() 
    {
      throw [some exception];
    };
}
于 2018-11-15T09:29:31.423 回答