Возможный дубликат:
Почему нет звонка конструктору?
Я использую Visual Studio 2012, предположим, что тест является классом
class Test
{
};
Когда я создаю новый экземпляр Test, чем отличаются следующие два способа?
путь 1
Test t;
путь 2
Test t();
Я получил этот вопрос в коде ниже, изначально я определил экземпляр A способом 2, я получил только одну ошибку, потому что B не предоставляет конструктор по умолчанию, но когда я определяю его способом 1, я получил дополнительную ошибку.
class B
{
B(int i){}
};
class A
{
A(){}
B b;
};
int main(void)
{
A a(); // define object a in way 2
getchar() ;
return 0 ;
}
если я определю в пути 1
A a;
Я получил еще одну ошибку сказал
ошибка C2248: «A :: A»: невозможно получить доступ к закрытому члену, объявленному в классе
‘A’
Так что я думаю, что между этими двумя способами должны быть некоторые различия.
Test t;
определяет переменную с именем t
типа Test
,
Test t();
объявляет функцию с именем t
который не принимает параметров и возвращает Test
,
В чем разница между двумя декларациями?
A a();
Объявляет функцию, а не объект. Это один из Самый неприятный разбор в C ++.
Объявляет функцию по имени a
который не принимает параметров и возвращает тип A
,
A a;
Создает объект с именем a
типа A
вызывая его конструктор по умолчанию.
Почему вы получаете ошибку компиляции?
Для класса по умолчанию указатель доступа private
так что вы получите ошибку, потому что ваш конструктор класса private
и он не может быть вызван при создании объекта с вышеуказанным синтаксисом.