我是c ++语言的新手,而且我熟悉java语言。
在Java世界中,代码看起来不错,但不是用c ++。
有人可以解释一下这两个构造函数被调用的原因吗?
SELECT * FROM foo ORDER BY timestamp ASC LIMIT 1
UNION ALL
SELECT * FROM bar ORDER BY timestamp ASC LIMIT 1
UNION ALL
SELECT * FROM baz ORDER BY timestamp ASC LIMIT 1
-- etc...
我打算调用两个参数构造函数
输出:
defualt构造函数
两个Arguments构造函数
答案 0 :(得分:5)
在Tool
类中,Position
对象首先在执行Tool
构造函数体之前默认构造。然后在Position
构造函数体中创建一个新的临时Tool
对象,并将其用于将分配给pos
。
这里的重要部分是对象构建分为三个步骤:
Position
默认构造函数)Position
构造函数)要仅使用双参数Position
构造函数,而不是简单地分配给pos
对象,您需要使用构造函数初始化列表。您可以通过修改Tool
构造函数来执行此操作:
Tool(char Team,unsigned int row,unsigned int col)
: pos(row, col), // Initializes the `pos` object
team(Team) // Initialize the `team` member
{
// No code needed, the members have already been initialized
}
答案 1 :(得分:3)
在C ++中,所有成员变量都是在输入构造函数体之前构造的。您的代码默认自动构造一个Position,然后在构造函数的主体中创建另一个位置,并将分配它到之前构建的位置。
您需要使用初始化列表传递位置参数:
Tool(char Team,unsigned int row,unsigned int col) : pos( row, col ), team(Team) {
// constructor now empty
}
通常,构造函数的主体应该是空的。
答案 2 :(得分:0)
当执行进入构造函数体时,需要构造拥有类的成员对象(如果未指定对构造函数的显式调用,则使用默认构造函数。)
进入构造函数体后,Position(row,col)
中的pos = Position(row,col);
会创建一个临时Position
对象,该对象将被分配到pos
。
如果你想避免调用成员对象的默认构造函数,在这种情况下,在初始化列表中使用初始化成员:
Tool(char Team,unsigned int row,unsigned int col)
: pos (row, col), team (Team)
{
}
为什么Java中的代码正如您所期望的那样,是因为您总是将引用作为值运行到对象而不是对象上。 Java中的非初始化成员对象引用将默认初始化为null
(如果内存服务正确),直到您创建对象,并分配引用对它,对成员变量。