在构造函数成员初始化之前调用成员函数的语法

Syntax to call a member function before constructor member initialization

我见过类似下面的代码,用于在调用构造函数之前调用成员函数。 _data 的构造函数初始化在构造函数之前调用成员函数'function()'。

class foo
{
public:
    foo();
private:
    int *_data;
    void function();
};

foo::foo() :
    _data((int *)(function(), NULL))
{
    std::cout << "foo::constructor called" << std::endl;
}

void foo::function()
{
    std::cout << "foo::function called" << std::endl;
}

int main()
{
    foo * _foo = new foo;
    delete _foo;
    return 0;
}

输出:

foo::function called
foo::constructor called

我不太了解 _data 构造函数初始化的语法。如果您执行以下操作:

foo::foo() :
  _data((int *)function())

您收到类型转换错误: C2440:'type cast':无法从 'void' 转换为 'int *'

谁能解释一下这是怎么回事?

foo::foo() :
  _data((int *)(function(), NULL))

这是 comma operator

... a binary operator that evaluates its first operand and discards the result, and then evaluates the second operand and returns this value (and type).

所以(int *)(function(), NULL)先调用function()然后returnsNULL.

然后 NULL 被转换为 int* 并用于初始化 _data

此构造使用 comma operator 来实现其效果。

在评估 (function(), NULL) 时,它首先评估 function,然后是 NULL。表达式的总体结果是 NULL,然后转换为 int *。因此,_data 被初始化为 NULL.