Различия в объявлениях переменных в C ++ - PullRequest
2 голосов
/ 16 апреля 2010
Class A 
{
};

В чем разница между A a, A* a и A* a = new A().

Ответы [ 2 ]

15 голосов
/ 16 апреля 2010
A a;

Создает экземпляр A, который живет в стеке, используя конструктор по умолчанию.

A *a;

Это просто неинициализированный указатель на A. На самом деле он не указывает на объект A, но мог бы. Инициализированный указатель (в данном случае значение NULL) будет выглядеть так:

A *a = 0;

Разница здесь в том, что нулевой указатель не указывает ни на какой объект, в то время как неинициализированный указатель может указывать куда угодно. Инициализация ваших указателей - это хорошая практика, чтобы понять, почему вы не задаетесь вопросом, почему ваша программа не работает или дает неверные результаты.

Аналогично, вы не хотите пытаться разыменовать ни указатель NULL, ни неинициализированный указатель. Но вы можете проверить нулевой указатель. Тестирование неинициализированного указателя дает неопределенные и ошибочные результаты. На самом деле это может быть! = 0, но, безусловно, не указывает нигде, где вы намереваетесь указать. Прежде чем проверять их, убедитесь, что вы инициализировали ваши указатели и протестировали , прежде чем пытаться разыменовать их.

A a = new A();

должно быть записано как

A *a = new A();

и это создает новый объект A, который был размещен в куче. Объект A был создан с помощью конструктора default .

Если конструктор по умолчанию явно не написан для класса, компилятор неявно создаст его, хотя я не верю, что стандарт не указывает состояние членов данных для экземпляра объекта, неявно созданного. Для обсуждения неявных конструкторов по умолчанию см. Ответ Мартина Йорка на этот SO вопрос .

8 голосов
/ 16 апреля 2010

A a объявляет экземпляр A с именем a

A *a объявляет указатель на A класс

A *a = new A() выделяет пространство для a в куче и вызывает соответствующий конструктор (если конструктор не указан, он выполняет инициализацию по умолчанию).

Для получения дополнительной информации о последней форме см. http://en.wikipedia.org/wiki/New_%28C%2B%2B%29

...