c ++构造函数行为

时间:2017-01-17 17:54:11

标签: c++ constructor

我是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构造函数

3 个答案:

答案 0 :(得分:5)

Tool类中,Position对象首先在执行Tool构造函数体之前默认构造。然后在Position构造函数体中创建一个新的临时Tool对象,并将其用于分配给pos

这里的重要部分是对象构建分为三个步骤:

  1. 分配对象
  2. 初始化对象并构造其所有成员(此处调用Position默认构造函数)
  3. 执行对象的构造函数(此处调用双参数Position构造函数)
  4. 要仅使用双参数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(如果内存服务正确),直到您创建对象,并分配引用对它,对成员变量。