2016-05-24 13 views
0

Ich bin ein Student und ich lerne C++. Ich bin ziemlich gut in C++, immer noch "einfache" Dinge verwickeln mich. Ich habe lernen kürzlich Klassen, Methoden, Konstruktor/Deconstructor, Vererbung, virtuelle usw. habe ich diesen Code:Return Klasse Destruktor

#include <iostream> 
using namespace std; 

class test { 
    int a, c; 
public: 
    test() { cout << "Constructor\n"; } 
    test(int a) :a(a) { cout<<"Explicit Constructor\n"; } 
    test foo(const test&, const test&); 
    ~test() { cout << "DECONSTRUCTOR!\n"; } 
}; 

test test::foo(const test &t1, const test &t2) { 
    test rez; 
    rez.c = t1.a + t2.a; 
    return rez; 
} 

void main() { 
    test t1(5), t2(21), rez; 
    rez.foo(t1, t2); 
    cin.ignore(); 
} 

Ich weiß, dass in foo ich eine lokale Klasse erstellen, wenn außerhalb des Bereichs gelöscht. Wenn also foo aufgerufen wird, sollte ich einen Konstruktor und einen Destruktor sehen, aber es gibt mir noch einen Dekonstruktor, also habe ich einen Konstruktor für zwei Destruktoren.

+1

Sie müssen auch den Kopierkonstruktor Druck haben. – NathanOliver

+1

Nur ein FYI: Der Konstruktor nimmt ein einzelnes 'int' Argument, es ist nicht wirklich * explizit * mit C++ Terminologie. –

+0

Ich werde jemand anderen eine definitive Antwort geben lassen, aber ich bin ziemlich sicher, was Sie sehen, ist 'rez' in' test :: foo' wird zerstört, und dann der Rückgabewert von 'rez.foo (t1 , t2) 'zerstört werden – Hill

Antwort

2

Fügen Sie eine weitere Methode, um Ihre class test zu kopieren:

test(test const &) { cout << "Copy constructor" << endl; } 

Sehen Sie, was dann passiert.

0

Sie haben vergessen, den Kopierkonstruktor zu implementieren:

test(const test &rhs) 
{ 
    cout << "Constructor"; 
} 

Es wird verwendet werden, um die rez Objekt zurück an den Aufrufer von foo

0

Siehe Kommentare:

test test::foo(const test &t1, const test &t2) { 
    test rez; 
    // constructor for rez invoked 
    rez.c = t1.a + t2.a; 
    return rez; 
    // destructor for rez invoked 
} 

void main() { 
    test t1(5), t2(21), rez; 
    // 3 constructor invocations 
    rez.foo(t1, t2); 
    // constructor for return value is called 
    // but you are missing it since you did not implement copy constructor 
    // destructor for return value is called 
    // as you did not use it 
    cin.ignore(); 
    // 3 destructor invocations 
} 
Verwandte Themen