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

Syntax to call a member function before constructor member initialization

本文关键字:成员 函数 调用 语法 构造函数 初始化      更新时间:2023-10-16

我看到过类似于以下代码的内容,用于在调用构造函数之前调用成员函数。_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:"类型转换":无法从"void"转换为"int *">

谁能解释一下这里发生了什么?

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

它是逗号运算符。

。一个二元运算符,它计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回此值(和类型(。

所以(int *)(function(), NULL)首先调用function(),然后返回NULL

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

此构造使用逗号运算符来实现其效果。

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