2014-02-19 2 views
2

В следующем коде конструктор вызывается только один раз (то есть), когда выполняется Car(). Почему он не называется во второй раз в заявлении Car o1 (Car())?Конструктор C++, не называемый

#include <stdio.h> 
#include <iostream> 

class Car 
{ 
public : 
    Car() 
    { 
     std::cout << "Constructor" << '\n'; 
    } 
    Car(Car &obj) 
    { 
     std::cout << "Copy constructor" << '\n'; 
    } 
}; 

int main() 
{ 
    Car(); 
    Car o1(Car()); // not calling any constructor 
    return 0; 
} 
+2

'o1' - это объявление функции. – Simple

+0

это кажется правильным – Dinesh

ответ

10
Car o1(Car()); 

Объявляет функцию под названием o1, которая возвращает Car и принимает один аргумент, который является функцией, возвращающей Car. Это называется most-vexing parse.

Вы можете это исправить, используя дополнительную пару скобок:

Car o1((Car())); 

Или с помощью единообразного инициализации в C++ 11 и далее:

Car o1{Car{}}; 

Но для этого, чтобы работать, вам 'нужно будет ввести тип параметра конструктора Car a const Car&, иначе вы не сможете привязать его к нему временным.

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