new foo и new foo()

      Комментарии к записи new foo и new foo() отключены

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 2 мес., 3 нед. назад.

  • Автор
    Сообщения
  • #3631

    struct boo
    {
        float x;
    };
    
    struct foo
    {
        int x;
        int y;
        boo z;
    };
    
    int main()
    {
        foo* f1 = new foo;   // 1
        foo  f2;             // 2
    
        foo* f3 = new foo(); // 3
        foo  f4 = foo();     // 4
    
        return 0;
    }

    Разница состоит в том, что в первом и втором случаях все внутренности базового типа не инициализируются, а в третьем и четвертом — инициализируются нулями.

    Это, однако, не относится к внутренностям базового типа родительского класса, если в дочернем классе объявлен конструктор по умолчанию. Для родительских типов играет роль лишь то, каким образом они будут представлены в списке инициализации конструктора по умолчанию дочернего класса.

    struct base
    {
        int a;
    };
    
    struct foo : base
    {
        int x;
    };
    
    struct boo : base
    {
        int x;
    
        boo() { }
    };
    
    struct zoo : base
    {
        int x;
    
        zoo() : base() { }
    };
    
    int main()
    {
        foo* f1 = new foo;   // foo::base::a = ?
        foo  f2;             // foo::base::a = ?
        foo* f3 = new foo(); // foo::base::a = 0
        foo  f4 = foo();     // foo::base::a = 0
    
        boo* b1 = new boo;   // boo::base::a = ?
        boo  b2;             // boo::base::a = ?
        boo* b3 = new boo(); // boo::base::a = ?
        boo  b4 = boo();     // boo::base::a = ?
    
        zoo* z1 = new zoo;   // zoo::base::a = 0
        zoo  z2;             // zoo::base::a = 0
        zoo* z3 = new zoo(); // zoo::base::a = 0
        zoo  z4 = zoo();     // zoo::base::a = 0
    
        return 0;
    }

Для ответа в этой теме необходимо авторизоваться.