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

Default initialize data members that are objects?

本文关键字:数据成员 对象 初始化 默认值      更新时间:2023-10-16

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

下面是一个示例:

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
};

类内初始值设定项仅适用于operator=语法或大括号初始值设定项列表,不适用于函数样式初始化。所以

foo x{1};

而不是

foo x(1);

应该做这个伎俩。

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

foo x = 1;

但是如果foo的构造函数采用单个int explicit,这将中断。

允许在类定义中直接初始化会导致难以区分函数声明:

考虑:

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};