1

所以我知道在类中编写构造函数后,默认构造函数就会消失,所以你必须开始初始化每个对象。但是,有没有办法编写一个默认构造函数,这样您就不必这样做了?

谢谢。

4

4 回答 4

7

C++11 之前

class MyClass
{
public:
    MyClass(int x, int y) {}
    MyClass() {}
};

或在 C++11 中

class MyClass
{
public:
    MyClass(int x, int y) {}
    MyClass() = default;
};

您可以编写任意数量的构造函数,但要避免使您的类难以使用。

于 2013-07-09T15:11:10.310 回答
2

隐式默认构造函数消失了。您仍然可以编写另一个默认构造函数,一个不接受任何参数或只接受具有默认值的 args 的构造函数;它只是不是由编译器为你完成的。

没有理由你不能只为一个类编写一个空的构造函数A并为每个值取默认值。也许不是最好的主意,但可以做到。

A() {/* empty */}

如评论中所述,如果您使用的是 c++11,您还可以使用新的default 关键字来为您提供编译器在执行“默认”时将拥有的内容

A() = default; 
于 2013-07-09T15:09:38.990 回答
1
struct S {
    S(int) {} // non-default constructor that suppresses the implicit default constructor

    S() = default; // bring the default constructor back
};

请注意,使用“默认”有两种含义。从某种意义上说,有一个默认构造函数,它具有一个签名,以便它将在“默认构造”中使用。

其次,“默认”是指实现将匹配编译器为隐式声明的构造函数自动生成的内容。

您可以通过为构造函数提供默认参数来使您的类默认可构造(第一种意义上的默认)。

struct S {
    S(int = 10) {}
};

While= default用于明确要求默认实现(第二种意义上的默认)。

由于多种原因,假设您的编译器= default使用它通常优于使用它S() {}= default在类定义中产生一个非用户提供的构造函数,它有几个效果。

  • 用户提供的特殊成员函数绝不是微不足道的
  • 用户提供的构造函数会取消类型作为聚合的资格。
  • 值初始化包括对具有非用户提供的默认构造函数的类型进行零初始化
  • 对于没有用户提供的默认构造函数的类型,不允许对 const 对象进行默认初始化

由于这些影响之一,有时可能需要用户提供的功能。仍然可以= default在类定义之外使用它:

struct S {
    S();
};

S::S() = default;

上面提供了编译器的默认实现,但仍然算作用户提供的默认构造函数。此外,这可用于维持 ABI 稳定性;稍后= default可以用另一个定义替换,而不必重新编译所有代码构造S对象,而内联默认构造函数则需要它。

于 2013-07-09T15:11:27.907 回答
0
class A
{
public:
    // Or use A()=default for C++11
    A(){}

    A(int v):m_value(v){}

private:
    int m_value;
};

int main()
{
    A a; // Without default ctor ==>> error C2512: 'A' : no appropriate default constructor available

    return 0;
}
于 2013-07-09T15:14:37.527 回答