LINUX.ORG.RU

g++ инициализация членов класса по умолчанию


0

0

Доброе время суток,

в новых g++ (> 3.3.4) член класса по умолчанию не инициализируется.
Это баг, особенность дебиана или так и должно быть?

Если я правильно перевел стандарт, то "обычные" типы должны быть 
автоматически проинициализированны в 0.

Пример:

#include <iostream>

class A
{
  
public:
  int i;
  double d;
  
};

using namespace std;
int main (int argc, char * argv[])
{
  
  A a;
  cout<<a.d<<" "<<a.i;
  return 0;
};

g++ -v; g++ -o test test.cc && ./test

gcc version 3.3.3 20040412 (Red Hat Linux 3.3.3-7)
6.43534e-317 0

gcc version 3.3.4 (Debian 1:3.3.4-13)
-1.99768 1076069920

gcc version 3.4.2 (Debian 3.4.2-2)
-1.99768 1076164128

Спасибо
anonymous

> Если я правильно перевел стандарт, то "обычные" типы
> должны быть автоматически проинициализированны в 0.

не должны. где вы такое увидели?

idle ★★★★★
()

В Java и Object Pascal и т.д. должны, в C++ по умолчанию данные не иницилизируются, за исключением static переменных.

fghj ★★★★★
()
Ответ на: комментарий от idle

ISO/IEC 14882:1998(E)
12.6.2 Initializing bases and members

  If a given nonstatic data member or base class is not named by a mem-initializer-id (including the case
4
  where there is no mem-initializer-list because the constructor has no ctor-initializer), then
  -- If the entity is a nonstatic data member of (possibly cv-qualified) class type (or array thereof) or a base
      class, and the entity class is a non-POD class, the entity is default-initialized (8.5). If the entity is a non-
      static data member of a const-qualified type, the entity class shall have a user-declared default construc-
      tor
--------------------------
8.5 Initializers

To default-initialize an object of type T means:
-- if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is
   ill-formed if T has no accessible default constructor);
-- if T is an array type, each element is default-initialized;
-- otherwise, the storage for the object is zero-initialized.

anonymous
()
Ответ на: комментарий от fghj

Да это я напутал. Еще раз спасибо.

anonymous
()
Ответ на: комментарий от anonymous

> ISO/IEC 14882:1998(E)
> 12.6.2 Initializing bases and members

да... внушает... теперь-то я понял, почему С++
считается сложным для обучения. короче, не должны :)

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.