很抱歉标题非常糟糕,但我真的不知道写些什么。
我有以下库Neural_Network.h,其中包含C ++中的网络类:
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)后面的函数名称。它的目的是什么?
答案 0 :(得分:7)
它被称为初始化列表,并且只能在构造函数上使用。它与写作
的效果大致相同this->m_numInputs = settings.m_numInputs;
this->m_numHidden = settings.m_numHidden;
this->m_numOutputs = settings.m_numOutputs;
在构造函数体内。
最重要的区别是初始化列表也适用于const
成员和引用(在这种情况下是必需的,因为您无法以通常的方式分配这些成员和引用)。这是因为初始化列表直接调用成员的构造函数,而不是首先默认构造它们然后调用赋值运算符。
答案 1 :(得分:3)
它的目的是什么?
初始化类的数据成员。
这称为初始化列表。
构造函数在初始化列表中而不是在其正文中初始化其类的数据成员是很常见的。
在Why should I prefer to use member initialization list?
中了解详情例如,这个:
<ul>
<li id="menu1" onclick="textshowhide('1')">Menu 1</li>
<li id="menu2" onclick="textshowhide('2')">Menu 2</li>
<li id="menu3" onclick="textshowhide('3')">Menu 3</li>
</ul>
<div id="menu_txt1" class="container_hide">Page1</div>
<div id="menu_txt2" class="container_hide">Page2</div>
<div id="menu_txt3" class="container_hide">Page3</div>
会将数据成员Network::Network(Settings const& settings) : m_numInputs(settings.m_numInputs)
设置为m_numInputs
。同样会发生:
settings.m_numInputs
答案 2 :(得分:2)
那是初始化列表。
基本上,这是在构造中初始化类成员的标准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)
{ }