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

时间:2015-03-05 15:20:36

标签: c++ syntax constructor 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:&#39;输入&#39; :无法转换为&#39; void&#39;到&#39; int *&#39;

有人能解释一下这里发生了什么吗?

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

2 个答案:

答案 0 :(得分:3)

这是comma operator

  

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

因此(int *)(function(), NULL)首先调用function(),然后返回NULL

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

答案 1 :(得分:0)

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

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