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

lel*_*lli 1 c++ oop struct function c++11

抱歉标题非常糟糕,但我真的不知道该怎么写.

我有以下库Neural_Network.h和C++中的类Network:

class Network{
    public:
       struct Settings
       {
           uint32_t                        m_numInputs;
           uint32_t                        m_numHidden;
           uint32_t                        m_numOutputs;
       };
       Network(Settings const& settings);
}
Run Code Online (Sandbox Code Playgroud)

然后,在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();
}
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么我需要在函数名称之后需要:: m_numInputs(settings.m_numInputs),m_numHidden(settings.m_numHidden),m_numOutputs(settings.m_numOutputs).它的目的是什么?

Tho*_*mas 7

它被称为初始化列表,只能在构造函数上使用.它与写作大致相同

this->m_numInputs = settings.m_numInputs;
this->m_numHidden = settings.m_numHidden;
this->m_numOutputs = settings.m_numOutputs;
Run Code Online (Sandbox Code Playgroud)

在构造函数体内.

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

  • 它与在体内书写它们的效果不同.在您分配给它们的正文中,在初始化列表中,您通过调用相应的构造函数来构造它们(这就是为什么它适用于`const`成员,您可以构造它们,但不能分配给它们). (2认同)
  • @lelli这[问题](/sf/ask/64872671/)可能有助于解释这些差异(基本上,它的构造与在身体中分配). (2认同)