=类构造函数中的默认值

时间:2012-05-07 15:01:28

标签: c++ c++11

我知道制作这样的构造函数:

foo()=delete;

会让它无法接受,但是:

foo()=default;

?我有时会看到这个,但我不知道这意味着什么!

4 个答案:

答案 0 :(得分:8)

以下是default有用的方法。回想一下,为了成为POD(“普通旧数据”),类类型必须具有普通的默认构造函数

struct this_is_pod
{
     int a;
     double b;
};

struct this_is_not_pod
{
    char c;
    float d;
    this_is_not_pod() { }
};

然而,如果我们希望提供一种以某种非平凡的方式初始化类成员的方法呢?只编写非默认构造函数不起作用:

struct foo
{
    int m;
    void * p;
    foo(double q, Bar & o) : m(magic(q), p(o.gizmo(m, q)) { }
};

现在foo 不是 POD,因为它完全没有默认构造函数。添加我们自己的默认构造函数,如foo() {},仍然不起作用,因为现在默认构造函数不是很简单。 C ++ 11通过default

来解决问题
struct foo
{
    int m;
    void * p;
    foo(double q, Bar & o) : m(magic(q), p(o.gizmo(m, q)) { }
    foo() = default; // trivial!
};

static_assert(std::is_pod<foo>::value, "You will never see this message.");

答案 1 :(得分:4)

在C ++ 03中,如果没有定义任何构造函数,编译器会为您生成一个默认构造函数。但是,如果确实定义了其他构造函数,则编译器不会生成默认构造函数(根本没有)。

=default告诉编译器生成默认构造函数,即使您已经明确定义了一些其他构造函数。这是在C ++ 11中添加的 - 在C ++ 03(或98)中无法做到这一点。您明确定义的任何构造函数与编译器默认生成的内容至少略有不同。

答案 2 :(得分:0)

它告诉编译器猜测一个默认构造函数,指一个没有参数的构造函数。如果没有给出“删除”,这就是编译器通常会做的事情。它是在C ++ 11中引入的以及删除选项。

答案 3 :(得分:0)

编译器将隐式生成默认构造函数,除非您自己明确定义了任何构造函数。

即使您定义了非默认构造函数,foo() = default;也只是指示编译器生成默认构造函数。它 foo() {}相同(但请参阅Kerrek SB's answer)。

相关问题