2015-02-10 1 views
-9

Если я пишу класс имени Test и написать испытания типа показать функцию а() какПочему деструктор вызывается, но при вызове объекта в качестве параметра не вызывается конструкция?

#include <iostream> 
using namespace std; 

class Test{ 

public: 
    int x; 
    Test() 
    { 
     cout<<"Empty or Default Constructor"<<endl; 
    } 
    Test(int x) 
    { 
     cout<<"Valued constructor"<<endl; 
    } 
    ~Test() 
    { 
     cout<<"Destructor"<<x<<endl; 
    } 
    Test show(Test obj) 
    { 
     Test tt; 
     tt.x=20; 
     return tt; 
    } 
}; 
int main() 
{ 
    Test t1,t2(20); 
    t2.show(t2); 

    return 0; 
} 

Выход:

Empty or Default Constructor 
Valued constructor 
Empty or Default Constructor 
Destructor : 20 
Destructor : 1988276941 
Destructor : 1988276941 
Destructor : 1972875622 

затем выход показывает деструктор Test OBJ и return tt, но для них нет конструктора, но, как правило, мы знаем, что fir будет создан конструктор stly и после его завершения будет вызван деструктор задачи, но почему он является исключительным при передаче и возврате любого объекта?

+0

В «Test tt;» конструктор по умолчанию для теста будет вызываться (если он существует), но поскольку вы не предоставляете код теста, на него нельзя ответить. Также обратите внимание, что obj не используется вообще, поэтому компилятор может также оптимизировать его. –

+2

полностью напишите код и покажите, где вы печатаете. –

+0

@ DanielDaranas, не могли бы вы рассказать мне теперь, почему конструктор не звонит на тест obj и возвращает tt. –

ответ

1

Передача экземпляра класса по значению вызывает конструктор копирования.

Компилятор реализует конструктор копирования по умолчанию (по существу, поэтапный экземпляр после вызова конструкторов копирования любых базовых классов), если определение класса явно не указывает его. Этот создатель, созданный компилятором, не будет вызывать один из других конструкторов, который вы реализовали, поэтому построение копии ничего не напечатает. Однако деструктор будет вызываться для очистки копии по завершении.

В вашем классе, если вы реализуете конструктор копирования следующим образом;

Test(const Test &from) : x(from.x) 
{ 
    std::cout << "Copy constructor invoked" << std::endl; 
} 

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

Смежные вопросы