我们有两段代码。每段代码都有两个类,这些类非常相似。唯一的区别在于定义类B
的构造函数。
第一个程序:
using namespace std;
class A
{
public:
A( int x ) : val( x ) { cout << val << endl; }
private:
int val;
};
class B
{
public:
B( int x ) { instanceA( x ); }
private:
A instanceA;
};
int main()
{
B instanceB( 5 );
}
第二个程序:
using namespace std;
class A
{
public:
A( int x ) : val( x ) { cout << val << endl; }
private:
int val;
};
class B
{
public:
B( int x ) : instanceA( x ) { }
private:
A instanceA;
};
int main()
{
B instanceB( 5 );
}
第一个程序中类B
的构造函数定义为:
B( int x ) { instanceA( x ) }
第二个程序中类B
的构造函数定义为:
B( int x ) : instanceA( x ) { }
第一个代码无效,第二个代码正常 - 在这种情况下以及在全局范围内定义构造函数的第一种和第二种方式有什么区别?
编辑:而不是B( int x ) { instanceA( x ); }
需要B( int x ) { instanceA = A( x ) }
答案 0 :(得分:4)
对于第二种情况(XPath), XmlNodeList list = doc.SelectNodes("//FUNCTION-NAME-VALUE/VALUE");
foreach (XmlNode node in list)
{
XmlNode shortNameNode = node.SelectSingleNode("../../../SHORT-NAME");
node.InnerText = "RTE_ComCbk_" + shortNameNode.InnerText;
}
将由instanceA
直接初始化。
对于第一种情况,A::A(int)
将首先由instanceA
(默认构造函数)初始化,构造函数的主体将在稍后执行。由于A::A()
没有默认构造函数,因此失败。
初始化顺序
3)然后,按照以下顺序初始化非静态数据成员 类定义中的声明。
4)最后,执行构造函数的主体
并且A
没有按照您的预期行事(即调用instanceA(x);
来初始化它),它将被解析为A::A(int)
并且不会编译,因为它和&#39} #39; s不提供instanceA.operator()(x);
。
答案 1 :(得分:1)
instanceA( x );
不是函数