2015-04-04 2 views
0
whats is the difference between these three statements in c++ ?? 
aa *obj; 
aa *obj1 = new aa; 
aa *obj2 = new aa(); 

где aa является классом Я являюсь confucion в последних двух утверждениях.Объявление класса объекта confucion

+1

Двое из них объясняются здесь: http://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name-make-a-difference-with-new – chris

+0

Он это сказал был классом, а не встроенным типом данных. Я думаю, это может быть POD, но это действительно старые компиляторы, которые заботятся. –

+0

@ JDługosz Важное значение имеет спецификация языка, а не возраст компилятора. – juanchopanza

ответ

1

Первый не инициализирует указатель.

В последней спецификации,

  • Если новый инициализатор-опущен, то объект по умолчанию инициализирован (8.5); если инициализация не выполнена, объект имеет неопределенное значение.
  • В противном случае новый-инициализатор интерпретируется в соответствии с правилами инициализации 8.5 для прямой инициализации.

То есть, если класс (вы сказали, что это класс) не есть конструктор, то первая форма будет действовать так же, как локального определения объема и оставить память не- инициализируется.

Пустой инициализатор заставит его инициализировать в любом случае, что дает те же результаты, что и переменная этого типа.

У класса может не быть конструктора, даже скрытого конструктора, если он содержит только элементы данных примитивных типов. Вы увидите, что это обсуждается как «POD», или данные plain'ol. Для шаблонов эта разница оказалась раздражающей, поэтому правила были усовершенствованы для работы, причем() равномерно для любого типа, даже для встроенных типов. new int() даст указатель на значение, имеющее значение 0. new int даст указатель на значение, содержащее все мусорные вещи, которые раньше были на этом адресе.

+0

Второе и третье высказывания могут отличаться по смыслу в зависимости от определения 'aa'. – juanchopanza

+0

Я стою исправлены. Я знал, что это изменилось, но получило это назад. . –

+0

Может ли кто-нибудь уточнить этот «первый оператор [aa * obj] Будет ли инициализированный указатель * obj автоматически будет адресовать объект класса aa. Теперь проблема в том, где и где создается объект aa и как его инициализированный неявный указатель obj ?? ? потому что я только что определил указатель класса aa, но не инициализировал его с адресом aa ... ???? – Gaurav