Вот код: Код (Text): public: NLS_Port(NLS_FLAGS8 type=0, NLS_FLAGS8 mode=0, NLS_FLAGS8 state=0); NLS_Port(NLS_FLAGS8 type, NLS_FLAGS8 mode, NLS_FLAGS8 state, NLS_AIPort *int_port); NLS_Port(NLS_AIPort *int_port); ~NLS_Port(); ================================================= NLS_Port::NLS_Port(NLS_AIPort *iport) { // Вызов конструктора внутри конструктора. NLS_Port(0,0,0); /* Asm EQU 0040164A push 0 0040164C push 0 0040164E push 0 00401650 lea ecx,[ebp-28h] 00401653 call NLS_Port::NLS_Port (004014d0) 00401658 lea ecx,[ebp-28h] <span style="background-color: FF0000]0040165B call NLS_Port::~NLS_Port (004016a0)</span><!--back--> */ iport = iport; link_to_interface(); } Как Вы можете это Объяснить?
во-первых это вызов деструктора. Во-вторых все правильно. NLS_Port(0,0,0) - создает экземпляр класса и т.к. он дальше не юзается то вызывается деструктор.
Значит, выходит, что NLS_Port(0,0,0); не получает this ЭТОГО класса, внутри коротого она вызывается.... А получает другой this? Но ведь мы видим совершенно иное - оно разрушает существующий this - или я ошибаюсь?
Edmond дело в том что Код (Text): NLS_Port(0,0,0) - это не есть явный вызов конструктора как ф-ции. Это определение анонимной локальной переменной типа NLS_Port.
Код (Text): #include <stdio.h> #define NLS_FLAGS8 int #define NLS_AIPort int class NLS_Port { public: NLS_Port(NLS_FLAGS8 type=0, NLS_FLAGS8 mode=0, NLS_FLAGS8 state=0); NLS_Port(NLS_AIPort *int_port); ~NLS_Port(); }; NLS_Port::~NLS_Port() { printf("dest %08X\n", this); } NLS_Port::NLS_Port(NLS_FLAGS8 type, NLS_FLAGS8 mode, NLS_FLAGS8 state) { printf("const3 %08X\n", this); } NLS_Port::NLS_Port(NLS_AIPort *int_port) { printf("const1 begin %08X\n", this); NLS_Port(0,0,0); // -> создание объекта и уничтожение тут-же printf("const1 end %08X\n", this); } void main(void) { int r; NLS_Port *tt = new NLS_Port(&r); printf("created %08X\n", tt); delete tt; printf("deleted %08X\n", tt); } результаты: const1 begin 00321F40 const3 0012FEBB dest 0012FEBB const1 end 00321F40 created 00321F40 dest 00321F40 deleted 00321F40
если хочешь вызвать другой конструктор, нодо сделать отдельный метод и звать его из обоих конструкторов.
Не знаю, что на этот счёт говорит стандарт, но VC (и интел) позволяет вызвать конструктор по его полному имени: Код (Text): this->NLS_Port::NLS_Port(0,0,0);
Shur Мда. Так нет у меня Дома Страуструпа (Он уехал временно на прочитку в другой город) У меня такое чуство, что там был пример с Конструкторами Date в книге... а что.. не помню. :/ Так что гляньте кто может...
можно и так, но честно скажу я ни разу не встречал такие вызовы. IMO не очень это красиво, отдельный метод читабельнее на порядок.
volodya то есть ? не понял твоего вопроса. Код (Text): NLS_Port(0,0,0); эквивалентно Код (Text): { NLS_Port tmpvar(0,0,0); }
Запутали вы меня, господа. У Димки один конструктор с дефолтными аргументами - там и есть три нуля. Второй, перегруженный, с четырьмя. Есть и третий. С одним. Ассемблер показывает, что вызывается первый - там, где дефолтные аргументы. При чем тут твоя переменная? :-/ Откуда ты ее вообще взял?
володя, посмотри мой пример. там создается экземпляр класса внутри первого конструктора вместо вызова второго. А вариант this->class::class работает как положено.
infern0 Твой экземпляр я и посмотрел. Там все понятно. Мне непонятно, откуда появилась сия анонимная переменная, которую green придумал!
Я подумал, что Edmond считает запись Код (Text): NLS_Port(0,0,0); просто вызовом конструктора как ф-ции, с передачей ему текущего this. На самом деле эта запись означает создание временной переменной (или оъекта если угодно) типа NLS_Port (процесс создания естественно включает вызов конструктора). Вот более узнаваемый пример: Код (Text): void sample(NLS_Port &port); sample(NLS_Port(0,0,0)); при вызове Код (Text): sample создается временный (анонимный) объект, который будет уничтожен сразу после вызова.
На самом деле эта запись означает создание временной переменной (или оъекта если угодно) типа NLS_Port (процесс создания естественно включает вызов конструктора). Вот теперь и я понял, что ты хотел сказать