2015-03-05 3 views
2

Я видел что-то вроде следующего кода, используемого для вызова функции-члена до вызова конструктора. Инициализация конструктора для _data вызывает функцию-член функции() перед конструктором.Синтаксис для вызова функции-члена перед инициализацией элемента-конструктора

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: «типа произнесение»: не может конвертировать из «пустоты» до 'междунара *

Может кто-нибудь объяснить, что происходит Здесь?

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

'function()' возвращает 'void'. И да, вы не можете преобразовать 'void' в тип non-'void', потому что это не имеет смысла. Этот код использует оператор запятой, чтобы сначала вызвать функцию, а затем выбросить его возвращаемое значение void, дать 'NULL' и назначить это функции' _data'. –

+0

, пожалуйста, не делайте этого, если вам нужна сложная конструкция, пожалуйста, рассмотрите статическую заводскую функцию. Преимущества намного перевешиваются неопределенным поведением. – Mgetz

ответ

3

Это 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(), а затем возвращает NULL.

NULL затем отливают до int* и используются для инициализации _data.

+0

Дополнение: В качестве стороннего внимания имейте в виду, что объект все еще неопределен, поэтому чтение любых его значений (вы этого не сделаете) было бы нецелесообразным. – Deduplicator

+0

, где это может быть полезно? –

+0

@MartinMeeser См. [This] (http://stackoverflow.com/questions/1613230/uses-of-c-comma-operator) и дубликат. – emlai

0

Эта конструкция использует comma operator для достижения ее эффекта.

При оценке (function(), NULL) сначала он оценивает function, затем NULL. Общий результат выражения равен NULL, который затем отливают до int *. Следовательно, _data инициализируется до NULL.

Смежные вопросы