2016-12-26 2 views
0

Это взорвало мой разум сегодня, пока я не понял его только compiles с булевыми параметрами.Конструктор с параметром bool позволяет компилировать код Java-esque

#include <iostream> 
using namespace std; 
class Foo { 
    bool _param; 
public: 
    Foo(bool param) { 
     _param = param; 
    } 
    void say() { 
     cout << "Param is "<< _param << endl; 
    } 
}; 

int main() { 
    Foo foo = new Foo(true); 
    foo.say(); 
    return 0; 
} 

Я также заметил, что конструктор вызывается дважды , то я думаю, что указатель создан «новый Foo (истина)» в настоящее время отливают в булево. Это оно? Если да, то почему он не работает с другими типами параметров? Есть ли что-то еще, чего я не вижу?

+1

При указателе типа "явный" может быть сделана ваша ошибка. – Jarod42

ответ

4
Foo foo = new Foo(true); 

эквивалентно

Foo foo(new Foo(true)); 

и результат указатель new превращается в true.

Именно поэтому он компилируется, и у вас есть утечка памяти.

2

Я добавлю к ответу πάντα ῥεῖ. Причина, по которой он (по-видимому) работает только с bool, заключается в том, что указатели могут использоваться с рассвета в виде булевых операндов. Таким образом, неявное преобразование должно существовать.

+0

Это часть, которую мне не хватало. Благодарю. –

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