2 Stimmen

Welche Rückkehr entsprechen dem C++-Standard

class A {};

class B 
{
public:
    B(const A& a, int i = 10) : m_a(a), m_i(i) {}
private:
    int m_i;
    A m_a;
};

B getB(void)
{
    //return B(A());  // Method one
    //return A();     // Method two
}

Beide Methode eins und Methode zwei bestehen die Kompilierung von VS2010.

Frage 1> Welche ist besser?

Frage 2> Ist es wahr, dass ein impliziter Konstruktor mehr als einen Parameter unterstützt, wenn alle außer dem ersten Parameter Standardwerte haben?

Vielen Dank

2voto

Billy ONeal Punkte 100691

Beide sind gültig und tun dasselbe. Ich würde den ersten benutzen, weil ich den zweiten verwirrend finde, aber andere Leute haben andere Vorlieben.

EDIT: Eigentlich würde ich noch mehr tun. Ich würde den Konstruktor von B als explicit markieren, um genau das zu verhindern, was dazu führt, dass der zweite kompiliert.

Hinweis: Ich würde die Verwendung von (void) in Methodensignaturen in C++ vermeiden.

1voto

Beide sind korrekt. Die erste erstellt explizit eine B-Instanz, und die zweite erstellt implizit eine B von A. Ich mag keine von beiden. Sie erhöhen nur das Verwirrungsniveau und nichts weiter.

1voto

Kerrek SB Punkte 445528

Ich würde den Konstruktor als explizit dekorieren und dann Methode eins als die einzige verfügbare Methode verwenden:

class B {
public:
    explicit B(A const & a, int b = 10) : m_a(a), m_i(b) { }
    // ...
};

B foo()  { return B(A()); }

Auf diese Weise kann man nie versehentlich ein B aus einem A konstruieren. Wenn der Konstruktor von B aufwendig ist oder eine Ausnahme auslösen kann, kann das Vorhandensein dieser zusätzlichen Ebene der Überlegung in Ihrem Code dazu beitragen, ihn lesbarer und weniger fehleranfällig zu machen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X