Вызов перегруженного конструктора С++ внутри другого...

Тема в разделе "WASM.ZEN", создана пользователем Edmond, 4 фев 2005.

  1. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU
    Вот код:


    Код (Text):
    1.  
    2. public:
    3.     NLS_Port(NLS_FLAGS8 type=0,
    4.             NLS_FLAGS8  mode=0,
    5.             NLS_FLAGS8  state=0);
    6.     NLS_Port(NLS_FLAGS8 type,
    7.             NLS_FLAGS8  mode,
    8.             NLS_FLAGS8  state,
    9.             NLS_AIPort  *int_port);
    10.     NLS_Port(NLS_AIPort *int_port);
    11.     ~NLS_Port();
    12.  
    13. =================================================
    14. NLS_Port::NLS_Port(NLS_AIPort *iport)
    15. {
    16.  
    17.         // Вызов конструктора внутри конструктора.
    18.  
    19.     NLS_Port(0,0,0);
    20.  /* Asm EQU
    21. 0040164A   push        0
    22. 0040164C   push        0
    23. 0040164E   push        0
    24. 00401650   lea         ecx,[ebp-28h]
    25. 00401653   call        NLS_Port::NLS_Port (004014d0)
    26. 00401658   lea         ecx,[ebp-28h]
    27.  
    28. <span style="background-color: FF0000]0040165B   call        NLS_Port::~NLS_Port (004016a0)</span><!--back-->
    29.  
    30. */
    31.     iport   = iport;
    32.     link_to_interface();
    33. }
    34.  
    35.  




    Как Вы можете это Объяснить?
     
  2. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    во-первых это вызов деструктора. Во-вторых все правильно. NLS_Port(0,0,0) - создает экземпляр класса и т.к. он дальше не юзается то вызывается деструктор.
     
  3. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU
    Значит, выходит, что

    NLS_Port(0,0,0); не получает this ЭТОГО класса, внутри коротого она вызывается....

    А получает другой this?



    Но ведь мы видим совершенно иное - оно разрушает существующий this - или я ошибаюсь?
     
  4. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Edmond

    дело в том что
    Код (Text):
    1. NLS_Port(0,0,0)
    - это не есть явный вызов конструктора как ф-ции.

    Это определение анонимной локальной переменной типа NLS_Port.
     
  5. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    Код (Text):
    1. #include <stdio.h>
    2.  
    3. #define NLS_FLAGS8 int
    4. #define NLS_AIPort int
    5.  
    6. class NLS_Port
    7. {
    8. public:
    9.     NLS_Port(NLS_FLAGS8 type=0,
    10.             NLS_FLAGS8  mode=0,
    11.             NLS_FLAGS8  state=0);
    12.     NLS_Port(NLS_AIPort *int_port);
    13.     ~NLS_Port();
    14. };
    15.  
    16. NLS_Port::~NLS_Port()
    17. {
    18.     printf("dest %08X\n", this);
    19. }
    20.  
    21. NLS_Port::NLS_Port(NLS_FLAGS8 type,
    22.             NLS_FLAGS8  mode,
    23.             NLS_FLAGS8  state)
    24. {
    25.     printf("const3 %08X\n", this);
    26. }
    27.  
    28. NLS_Port::NLS_Port(NLS_AIPort *int_port)
    29. {
    30.     printf("const1 begin %08X\n", this);
    31.     NLS_Port(0,0,0); // -> создание объекта и уничтожение тут-же
    32.     printf("const1 end %08X\n", this);
    33. }
    34.  
    35. void main(void)
    36. {
    37.     int r;
    38.     NLS_Port *tt = new NLS_Port(&r);
    39.     printf("created %08X\n", tt);
    40.     delete tt;
    41.     printf("deleted %08X\n", tt);
    42. }




    результаты:

    const1 begin 00321F40

    const3 0012FEBB

    dest 0012FEBB

    const1 end 00321F40

    created 00321F40

    dest 00321F40

    deleted 00321F40
     
  6. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    если хочешь вызвать другой конструктор, нодо сделать отдельный метод и звать его из обоих конструкторов.
     
  7. Shur

    Shur New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2002
    Сообщения:
    9
    Адрес:
    Moscow
    Не знаю, что на этот счёт говорит стандарт, но VC (и интел) позволяет вызвать конструктор по его полному имени:
    Код (Text):
    1. this->NLS_Port::NLS_Port(0,0,0);
     
  8. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU
    Shur

    Мда. Так нет у меня Дома Страуструпа :)

    (Он уехал временно на прочитку в другой город)



    У меня такое чуство, что там был пример с Конструкторами Date в книге... а что.. не помню.



    :/



    Так что гляньте кто может...
     
  9. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia


    можно и так, но честно скажу я ни разу не встречал такие вызовы. IMO не очень это красиво, отдельный метод читабельнее на порядок.
     
  10. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Это определение анонимной локальной переменной типа NLS_Port.



    Чего???
     
  11. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    volodya

    то есть ?

    не понял твоего вопроса.


    Код (Text):
    1. NLS_Port(0,0,0);


    эквивалентно
    Код (Text):
    1.  
    2. {
    3.    NLS_Port tmpvar(0,0,0);
    4. }
     
  12. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Запутали вы меня, господа.

    У Димки один конструктор с дефолтными аргументами - там и есть три нуля. Второй, перегруженный, с четырьмя.

    Есть и третий. С одним. Ассемблер показывает, что вызывается первый - там, где дефолтные аргументы. При чем тут твоя переменная? :-/ Откуда ты ее вообще взял?
     
  13. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    володя, посмотри мой пример. там создается экземпляр класса внутри первого конструктора вместо вызова второго. А вариант this->class::class работает как положено.
     
  14. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    infern0



    Твой экземпляр я и посмотрел. Там все понятно. Мне непонятно, откуда появилась сия анонимная переменная, которую green придумал!
     
  15. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Я подумал, что Edmond считает запись
    Код (Text):
    1. NLS_Port(0,0,0);
    просто вызовом конструктора как ф-ции, с передачей ему текущего this.

    На самом деле эта запись означает создание временной переменной (или оъекта если угодно) типа NLS_Port (процесс создания естественно включает вызов конструктора).



    Вот более узнаваемый пример:


    Код (Text):
    1. void sample(NLS_Port &port);
    2. sample(NLS_Port(0,0,0));


    при вызове
    Код (Text):
    1. sample
    создается временный (анонимный) объект, который будет уничтожен сразу после вызова.
     
  16. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    На самом деле эта запись означает создание временной переменной (или оъекта если угодно) типа NLS_Port (процесс создания естественно включает вызов конструктора).



    Вот теперь и я понял, что ты хотел сказать :)
     
  17. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    это я коряво выразился сначала. :)