new
, нельзя использовать скобки, если подразумевается вызвать конструктор по умолчанию. То есть нельзя писать: T a();
а надо писать: T a;
так как в первом случае такая запись будет означать декларацию функции a
, которая возвращает тип T
, а далеко не декларацию переменной класса T
с вызовом конструктора по умолчанию. Не спорю, это очевидно для профессионалов. Для новичков же порой подобная "неочевидная" разница вызывает затруднения, поэтому приведу простейший пример, которые расставит все на свои места.
#include <iostream>
class T {
public:
T() { std::cout << "constructor T()"; }
};
int main() {
std::cout << "T a: ";
// Это синтаксис создания экземпляра класса T с вызовом
// конструктора по умолчанию.
T a;
std::cout << std::endl;
std::cout << "T b(): ";
// А вот это декларация функции "b" без аргументов,
// которая возвращает тип T.
T b();
std::cout << std::endl;
return 0;
}
Данная программа напечатает: T a: constructor T()
T b():
Видно, что для T b();
никакой конструктор не был вызван. Что в целом и ожидалось. Использование круглых скобок может быть весьма тонким вопросом в С++.
Другие посты по теме: