默认初始化作为对象的数据成员?

时间:2016-01-11 11:43:24

标签: c++ c++11 object syntax

为什么必须在构造函数中初始化对象数据成员,并且不能像原始类型那样默认初始化它们?是否可以像原始类型一样初始化它们?

以下是一个例子:

class foo {
    int a;
public:
    foo(int _a) :a(_a) {};
};

class bar {
    string a = "asdf";//no error
    int num = 1;//no error
    foo x(1); //error, why?
    foo z;
public:
    bar(): z(1){}//no error
};

2 个答案:

答案 0 :(得分:5)

类内初始化程序仅使用operator=语法或大括号初始化程序列表,而不是函数样式初始化。所以

foo x{1};

而不是

foo x(1);

应该这样做。

在您的情况下,您也可以使用

foo x = 1;

但如果foo的构造函数只占int explicit,则会中断。

答案 1 :(得分:2)

在类定义中允许direct-initialization 会导致难以区分函数声明:

考虑:

struct k;

struct foo { foo(int x = 1){} };

class toto
{
static constexpr int k = 1;
foo x(1); // hm might be ok...
foo y(); // hm ... NOK , what y is ? an object or a function declaration?!?!
foo z(k); // problem .... this seems a fucntion definition?!!!
foo z{k}; // clear it is not a function definition
};

执行此操作的正确方法是:

foo f= 1;

foo f{1};

foo f = {1};