首页 > 解决方案 > C ++:存在构造函数时的结构初始化

问题描述

使用列表初始化结构时,我对 C++ 行为有疑问。例如,以下代码在 C 和 C++ 中的行为相同。列表初始化x

struct X {
    int x;
};

int main(int argc, char *argv[])
{
    struct X xx = {0};    
    return 0;
}

现在,如果我添加一个构造函数,我通过测试发现调用的是构造函数而不是简单的x成员初始化:

#include <iostream>
using namespace std;

struct X {
    int x;
    X(int);
};

X::X(int i)
{
    cout << "X(int i)" << endl;
    x = i;
}

int main(int argc, char *argv[])
{
    struct X xx = {0};

    return 0;
}

输出:

X(int i)

C++ 的行为是否具有相同的构造函数(如上)来覆盖简单列表初始化?进行我的测试似乎就是这样。

谢谢!

标签: c++

解决方案


以下语法:

X xx = {0};

只是复制列表初始化的一种形式。X正如您所观察到的,这具有调用 的构造函数的效果。

这个初始化的名字来源于这样一个事实,它看起来像一个正在复制的列表,但只是调用了常规构造函数。请注意,这只会考虑implicit构造函数。

在c++ 中, .structxx

请注意,如果您不提供诸如X(int)(如您在第一个示例中所做的那样)的构造函数,则声明xx将改为进行聚合初始化。


推荐阅读