C :将结构传递到函数,无法理解语法

C++: passing a structure to a function, cannot understand syntax

本文关键字:语法 函数 结构      更新时间:2023-10-16

对不起,标题非常糟糕,但我真的不知道该写什么。

我在C 中具有以下库neural_network.h:

class Network{
    public:
       struct Settings
       {
           uint32_t                        m_numInputs;
           uint32_t                        m_numHidden;
           uint32_t                        m_numOutputs;
       };
       Network(Settings const& settings);
}

然后,在neural_network.cpp文件中,它通过以下方式实现:

Network::Network( Settings const& settings )
    : m_numInputs( settings.m_numInputs )
    , m_numHidden( settings.m_numHidden )
    , m_numOutputs( settings.m_numOutputs )
{
    assert( settings.m_numInputs > 0 && settings.m_numOutputs > 0 && settings.m_numHidden > 0 );
    InitializeNetwork();
    InitializeWeights();
}

我不太了解为什么我确实需要:: m_numinputs(settings.m_numinputs),m_numhidden(settings.m_numhidden) ,m_numoutputs(settings.m_numoutputs)之后。它的目的是什么?

它称为 initializer list ,只能在构造函数上使用。它的效果大致相同

this->m_numInputs = settings.m_numInputs;
this->m_numHidden = settings.m_numHidden;
this->m_numOutputs = settings.m_numOutputs;

构造体主体内部。

最重要的区别是,初始化器列表也适用于const成员和参考(在这种情况下是必需的,因为您无法以通常的方式分配给这些成员)。这是因为初始化器列表直接调用成员的构造函数,而不是首先默认构造它们,然后调用分配运算符。

它的目的是什么?

to 初始化类的数据成员。

这称为初始化列表

A 构造函数在初始化列表中而不是在其体内初始化其类的数据成员。

阅读更多信息,为什么我要使用成员初始化列表?


例如,此:

Network::Network(Settings const& settings) : m_numInputs(settings.m_numInputs)

将将数据成员m_numInputs设置为settings.m_numInputs。以下情况也会发生:

Network::Network(Settings const& settings) {
    m_numInputs = settings.m_numInputs;
}

那是初始化列表

基本上,这是在构造中初始化类成员的标准C 语法,该部分是在构造函数之前执行的。

这样做的是,将传递的settings参数的三个成员数据开始初始化Network类的三个成员数据。


话虽如此,我认为您的class Network在您展示时并不完整吗?您显示的Network类没有该数据成员。我认为完整的定义应该看起来像这样:

class Network{
    public:
       struct Settings
       {
           uint32_t                        m_numInputs;
           uint32_t                        m_numHidden;
           uint32_t                        m_numOutputs;
       };
       Network(Settings const& settings);
    private:
        unit32_t m_numInputs,
        unit32_t m_numOutputs,
        unit32_t m_numOutputs
};

旁注:如果Network的数据成员与Settings的数据成员具有相同的名称,这确实使您感到困惑,那么这确实是一个设计决定或纯粹的巧合,不必这样做。

一个更简单的示例,可以展示如何使用构造函数参数来初始化初始化列表中的数据成员。

class Foo {
private:
    int m_x,
    int m_y,
public:
    Foo(int dataA, int dataB);
};
Foo::Foo(int dataA, int dataB): m_x(dataA), m_y(dataB)
{ }