2016-03-19 10 views
2

Kann ich Standardwerte wie in METHOD 1 auf einmal angeben oder soll ich einen überladenen Konstruktor wie in METHOD 2 oder mit Initialisierungsliste wie in METHOD 3/4 verwenden?Standardwerte von Argumenten im C++ - Konstruktor

Welche Methode ist besser/richtiger Weg und warum (alle scheinen zu funktionieren)?

Und was ist der Unterschied zwischen METHODE 3 und 4 - sollte ich zuerst Konstruktor Deklaration angeben, und dann nächste Definition außerhalb der Klasse oder kann ich sofort die Definition angeben?

Methode 1:

#include <iostream> 
#include <string> 
using namespace std; 
const string GLOBAL_VAR = "XXX"; 

class Object 
{ 
private: 
    string var; 

public: 
    Object(string inArg = "yyy") 
    { 
     this->var = GLOBAL_VAR + inArg + "ZZZ"; 
    } 

    string show() 
    { 
     return this->var; 
    } 
}; 


int main() { 
    Object o1, o2("www"); 
    cout << o1.show() << endl; 
    cout << o2.show() << endl; 

    system("pause"); 
} 

Methode 2:

#include <iostream> 
#include <string> 
using namespace std; 
const string GLOBAL_VAR = "XXX"; 

class Object 
{ 
private: 
    string var; 

public: 
    Object() 
    { 
     this->var = GLOBAL_VAR + "yyyZZZ"; 
    } 

    Object(string inArg) 
    { 
     this->var = GLOBAL_VAR + inArg + "ZZZ"; 
    } 

    string show() 
    { 
     return this->var; 
    } 
}; 


int main() { 
    Object o1, o2("www"); 
    cout << o1.show() << endl; 
    cout << o2.show() << endl; 

    system("pause"); 
} 

Methode 3:

#include <iostream> 
#include <string> 
using namespace std; 
const string GLOBAL_VAR = "XXX"; 

class Object 
{ 
private: 
    string var; 

public: 
    //declaration: 
    Object(); 
    Object(string); 

    string show() 
    { 
     return this->var; 
    } 
}; 
//definition: 
Object::Object() : var(GLOBAL_VAR + "yyyZZZ") {} 
Object::Object(string inArg) : var(GLOBAL_VAR + inArg + "ZZZ"){} 


int main() { 
    Object o1, o2("www"); 
    cout << o1.show() << endl; 
    cout << o2.show() << endl; 

    system("pause"); 
} 

VERFAHREN 4:

#include <iostream> 
#include <string> 
using namespace std; 
const string GLOBAL_VAR = "XXX"; 

class Object 
{ 
private: 
    string var; 

public: 
    //declaration and definition in one: 
    Object() : var(GLOBAL_VAR + "yyyZZZ") {} 
    Object(string inArg) : var(GLOBAL_VAR + inArg + "ZZZ") {} 

    string show() 
    { 
     return this->var; 
    } 
}; 


int main() { 
    Object o1, o2("www"); 
    cout << o1.show() << endl; 
    cout << o2.show() << endl; 

    system("pause"); 
} 
+1

In C++ benötigen Sie nicht die Notation 'this->'. Greifen Sie direkt auf die Mitgliedsvariablen zu. –

+1

Es gibt wirklich keinen Unterschied zwischen Methode 2 und 3. Und der einzige Unterschied zwischen Methode 2 und 4 ist, dass man Initialisierungslisten verwendet, während die andere nicht. Das heißt, die Methoden 2, 3 und 4 sind gleich. Was "das Beste" ist, das ist das, was du denkst, es ist subjektiv und eine Frage der Meinung. –

Antwort

1

halte ich beide Ansätze gleichermaßen gültig. Abhängig von den Besonderheiten jeder einzelnen Klasse hat jeder Ansatz seine Vorteile, Stärken und Schwächen.

Die Verwendung eines Standardwerts ist normalerweise die beste Wahl, wenn das Objekt auf die gleiche Weise initialisiert werden muss, unabhängig davon, ob der Konstruktorparameter in den Standardzustand versetzt wird oder nicht. Wenn Sie einen Standardwert angeben, müssen Sie keinen Code mehr kopieren. Sie haben nur einen Konstruktor.

Auf der anderen Seite ermöglicht es die Verwendung überladener Konstruktoren, das Objekt auf völlig unterschiedliche Weise zu konstruieren, je nachdem, ob der Parameter angegeben ist oder nicht. Das Erzwingen, dass die Klasse einen einzelnen Konstruktor hat, führt in der Regel dazu, dass der Code in diesem Fall mit einer Reihe von if Anweisungen bombiert wird.

Vergessen Sie auch nicht die dritte Option: einen delegierenden Konstruktor. Verwenden Sie die Klasse in Ihrem Beispielcode:

Object() : Object("") 
{ 
} 

Dieser Ansatz hat auch seine eigenen Vorteile.

Es gibt keinen Konsens darüber, welcher Ansatz im Allgemeinen der beste ist. Es ist am besten, die individuellen Anforderungen jeder Klasse zu berücksichtigen und den Ansatz auszuwählen, der am besten für diese Klasse funktioniert. Was für eine Klasse am besten ist, ist möglicherweise nicht der beste Weg für eine andere Klasse.

+0

Gemäß einem delegierenden Konstruktor, welches ist besser: 'Object (String inArg =" yyy "): var (inArg) {var = GLOBAL_VAR + var +" ZZZ "; } 'oder' Object(): Object ("yyy") {} Objekt (String inArg): var (inArg) {var = GLOBAL_VAR + var + "ZZZ"; } '? – BlueMark

+0

Für diesen speziellen Fall glaube ich, dass der delegierende Konstruktor-Ansatz besser ist, zumindest mit dem Compiler, den ich verwende. Aber nur für diese spezielle Klasse. Diese Schlussfolgerung würde nur für diese bestimmte Klasse und keine andere Klasse gelten.Mit anderen Worten: Es ist von sehr geringem Wert; und dies sollte nicht so interpretiert werden, dass ein delegierender Konstruktor in einer anderen Klasse oder mit einem anderen Compiler besser wäre. Es ist erforderlich, dass Sie die Verwendung Ihrer Klassen und Ihren Compiler kennen und verstehen, um die richtige Schlussfolgerung zu diesem Thema für eine bestimmte Klasse zu erhalten. –

Verwandte Themen