2009-07-25 10 views
3

Ich habe dieses kleine Code-Snippet in C++ geschrieben, die Ausgabe ist ebenfalls beigefügt. Ich verstehe nicht, warum der Konstruktor nur einmal aufgerufen wird, während ich zwei Aufrufe für Destruktor sehen kann.C++ Konstruktor Aufruf

Von dem, was ich verstehe, Standardkonstruktors und überladenen Zuweisungsoperator sollte in Zeile 28.

genannt werden Kann jemand bitte etwas Licht auf das werfen:

1 #include <iostream> 
    2 using namespace std; 
    3 
    4 class ABC { 
    5 char c; 
    6 public: 
    7  ABC() { 
    8  cout << "default" << endl; 
    9  } 
10  ABC(char c) { 
11  this->c = c; 
12  cout << c << endl; 
13  } 
14  ~ABC() { 
15  cout << hex << this << " destructor " << c << endl; 
16  } 
17  void method() { 
18  cout << "method" << endl; 
19  } 
20  void operator= (const ABC& a) { 
21  cout << "operator" << endl; 
22  } 
23 
24 }; 
25 
26 int main() { 
27 ABC b('b'); 
28 ABC a = b; 
29 } 

Output in g++ version 4.0.1: 
~/src$ g++ test.cpp 
~/src$ ./a.out 
b 
0xbffff0ee destructor b 
0xbffff0ef destructor b 
+0

Was ist falsch mit dem Konstruktor-Tag? – GManNickG

Antwort

11

Der Code, den Sie nur die Kopie Konstruktor aufrufen, ist dies die Definition:

ABC(const ABC& a):c(a.c){ 
    cout << "copying " << hex << &a << endl; 
} 

Und Sie shoud Ausgabe wie folgt sehen:

b 
copying 0x7fffebc0e02f 
0x7fffebc0e02e destructor b 
0x7fffebc0e02f destructor b 

Wenn Sie die Standard anrufen möchten Konstruktor und dann der Zuweisungsoperator müssen Sie zwei separate Anweisung verwenden:

ABC b('b'); 
    ABC a; 
    a = b; 
15
ABC a = b; 

Dies ist einKopie Konstrukt r nicht der Zuweisungsoperator! Sie könnte es so neu definieren, was Sie haben, ist Compiler generierte ein:

ABC(const ABC& other) 
{ 
c = other.c; 
cout << c << " copy constructor" << endl; 
} 

Wenn Sie wirklich darauf bestehen, nicht eine Kopie Konstruktor können Sie converstion Operator wie Ihrer Klasse hinzufügen und den Copykonstruktor vergessen!

operator char() 
{ 
    return c; 
} 
+0

Noch besser, Sie könnten eine Initialisierungsliste verwenden. –

+0

Ja, wie es jetzt ist, enthält der Kopierkonstruktor einen Aufruf an den Zuweisungsoperator von 'c' in Ihrem Code –

+0

@litb, das ist wahr lol :) – AraK

0

Werfen Sie einen Blick auf den modifizierten Code Ihres

#include <iostream> 
using namespace std; 
class ABC { 
    char c; 
public: 

    ABC() { 
     cout << "default" << endl; 
    } 
     ABC(char c) 
     { 
      cout<<"parameterized constructor called\n";/////overloaded constructor called for the first line in main 
      this->c = c; 
      cout << c << endl; 
     } 
     ABC(ABC &c) 
     { 
      cout<<"Copy cons\n";//copy constructor is called for the second line in main 
     } 


     ~ABC() { 
      cout << hex << this << " destructor " << c << endl; 
     } 
     void method() { 
      cout << "method" << endl; 
     } 
     void operator= (const ABC& a) { 

     } 


    }; 


int main() 
{ 
     ABC b('b');//////here parameterized constructor is called i.e <ABC(char c)> 
     ABC a = b;/////////Here the copy constructor is called not the default one.(total 2 object created so the destructor is called twice!) 
} 

Die Ausgabe des Programms ist

parameterized constructor called 
b 
Copy cons 
0x7fff5fbff820 destructor � 
0x7fff5fbff828 destructor b 

können nun erklären, warum Copykonstruktor in 3 Fällen 1. Wenn ein Objekt aufgerufen wird in initialisiert 2.Wenn ein Objekt als Parameter an eine Funktion übergeben wird 0.3.wenn ein Objekt von einer Funktion zurückgegeben wird.

Wenn Sie keinen eigenen Kopierkonstruktor angeben, implementiert der Compiler einen eigenen Kopierkonstruktor, der das Objekt bitweise kopiert. Sie haben keinen eigenen Kopierkonstruktor angegeben, deshalb können Sie die beiden aus dem Code erstellten Objekte nicht verfolgen. Danke

Verwandte Themen