2016-07-19 11 views
2

Ich versuche, den folgenden Code auszuführen:initialisieren Membervariablen mit mehreren Konstruktor ruft

#include <iostream> 
using namespace std; 

class ABC { 
private: 
    int x, y; 
public: 
    ABC(){ 
     cout << "Default constructor called!" << endl; 
     ABC(2, 3); 
     cout << x << " " << y << endl; 
    } 
    ABC(int i, int j){ 
     cout << "Parameterized constructor called with parameters "<< i << " " << j << "!" << endl; 
     x = i; 
     y = j; 
     cout << x << " " << y << endl; 
    } 
}; 

int main(){ 
    ABC a; 
    return 0; 
} 

Ich erhalte die folgende Ausgabe:

Standard-Konstruktor aufgerufen!
Parametrierter Konstruktor mit Parameter 2 3 aufgerufen!
-858993460 -858993460

sollte nicht die Membervariablen mit den Werten 2 und 3 initialisiert?

+0

'ABC (2, 3);' erstellt eine lokale temporäre Instanz von 'ABC'. –

+0

Mögliches Duplikat von [Warum sollte ich die Elementinitialisierungsliste verwenden?] (Http://stackoverflow.com/questions/926752/why-should-i-prefer-to-use-member-initialization-list) – LogicStuff

+0

@ πάνταῥεῖ Wie sollte ich die Änderungen am selben Objekt vornehmen? – Ashish

Antwort

3

ABC(2, 3); stellt nicht den Konstruktor, die Mitglieder zu initialisieren, es ist nur eine temporäre Variable erstellen, die sofort zerstört werden.

Wenn Sie delegating constructor gemeint sollten Sie:

ABC() : ABC(2, 3) { 
    cout << "Default constructor called!" << endl; 
    cout << x << " " << y << endl; 
} 

Hinweis dies ein Merkmal C++ 11. Sie können eine Elementfunktion hinzufügen, wenn Sie C++ 11 nicht verwenden können.

class ABC { 
private: 
    int x, y; 
    init(int i, int j) { 
     x = i; 
     y = j; 
    } 
public: 
    ABC(){ 
     cout << "Default constructor called!" << endl; 
     init(2, 3); 
     cout << x << " " << y << endl; 
    } 
    ABC(int i, int j){ 
     cout << "Parameterized constructor called with parameters "<< i << " " << j << "!" << endl; 
     init(i, j); 
     cout << x << " " << y << endl; 
    } 
}; 
1

Sie erstellen eine temporäre Variable in ABC() Körper. Sie können diese Syntax dieses Problem zu umgehen verwenden:

class ABC 
{ 
private: 
    int x, y; 
public: 
    ABC() : ABC(2,3) 
    { 
     std::cout << "Default constructor called!" << std::endl; 
    } 
    ABC(int i, int j) 
    { 
     std::cout << "Parameterized constructor called with parameters "<< i << " " << j << "!" << std::endl; 
     x = i; 
     y = j; 
     std::cout << x << " " << y << std::endl; 
    } 
}; 
+0

Ich kann diesen Block des Codes auf der IDE nicht kompilieren Ich verwende (Visual Studio 2010 Professional). > Fehler Fehler C2614: 'ABC': ungültige Memberinitialisierung: 'ABC' ist keine Basis oder Mitglied – Ashish

+1

@Ashish Dies ist nur mit dem aktuellen C++ 11-Standard verfügbar. VS2010 ist zu alt. –