Expliziter Aufruf eines Konstruktors
Ich kenne das Konzept, das wir nennen können den Konstruktor sowohl Explicitly
und Implicitly
, und ich habe beide getestet die Szenarien(in der Regel bis jetzt alle meine Zwecke erfüllt bekam durch den Aufruf Konstruktor Implicitlly
), aber ich wunderte mich, dass der Konstruktor aufgerufen wird implizit Wann immer wir erstellen objects
,, also, was ist der Hauptgrund für den Aufruf der Konstruktor Explicitly
. Was Nachteil oder Vorteil es bietet, wenn wir rufen Konstruktor Explicitly
über die Implicit Call
?
Beispiel
class integer
{
int m ,n;
public:
integer (int x , int y);
};
integer :: integer (int x , int y )
{
m=x; n = y;
}
Nun, wenn ich rufen Sie wie
integer int1 = integer( 0 , 100); // Explicit Call
integer int1(1,100); //implicit call
- Für eine Sache, einen Konstruktor mit zwei oder mehr Argumente können nur aufgerufen werden.
- Zwei oder mehr Argumente?
- Können Sie einige code, der nur verwendet implizite Konstruktoren? Ich fühle mich wie es ist etwas Kontext fehlt in der Frage.
- Gut, dein Beispiel mit dem Titel "Explicit call" ist tatsächlich ein expliziter Aufruf der zwei-argument-Konstruktors, gefolgt von einem impliziten Aufruf des copy-Konstruktors, in der Erwägung, dass dein Beispiel mit dem Titel "Implizite call" ist tatsächlich ein expliziter Aufruf. So sollten Sie sich zuerst um Ihre Definitionen bevor Sie Fragen über irgendwelche Vorteile, weil nicht alles, was getan werden kann, durch einen expliziten Konstruktor-Aufruf kann gemacht werden, indem eine implizite (wie aschepler bereits erwähnt), wäre das ein klarer Vorteil.
- Rau mein code ist nur ein Beispielcode, um zu zeigen, jeder Anruf, ich möchte nur Fragen, die ich anrufen kann Konstruktor von beiden Typen, aber warum EXPLIZITEN AUFRUF
- Ok, lassen beiseite die echte definition von expliziten aufrufen und unter Berücksichtigung der eigenen, dann die Wahl
integer int1 = integer(0, 100)
überinteger int1(1, 100)
zwar keinen Sinn macht hier. Aber Bedenken Sie, dass die tatsächliche definition eines expliziten Konstruktor-Aufruf ist etwas ganz anderes (und das zweite Beispiel ist eigentlich eine explizite Konstruktor-Aufruf), das macht die meisten der vorhandenen Antwort nicht die Beantwortung Ihrer eigentlichen Frage an alle. Und die gibt explizite Konstruktor ruft eine ganze Reihe von Vorteilen, wie Sie Sie nutzen die meiste Zeit für Dinge, die Sie nicht mit implicits. - Rau ...ok also nach ur statment
And which gives explicit constructor calls a whole bunch of advantages, as you use them most of the time for things you cannot do with implicits.
können Sie bitte schreiben Sie diese Vorteile in form einer Antwort.? - getan.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei verschiedene Probleme hier, wie Ihre definition von explizite und implizite nicht mit der standard-definition - (auf denen die meisten der bisherigen Antworten basieren, geschrieben werden, bevor Sie Hinzugefügt, dein Beispiel mit Ihrer eigenen definition von explizite und implizite).
Ok, so betrachten Sie zunächst Ihre definition von explizite, das wäre (ich denke, Sie nennen es explizite, da Sie ausdrücklich schreiben, der Typ-name?):
gegen Ihre definition von implizite wäre:
In diesem Fall die erste "explicit" nennen, wirklich keinen Vorteil gegenüber dem zweiten "implizite" nennen. Aber es gibt noch einen Unterschied. Die erste, tatsächlich erstellt eine temporäre Verwendung der zwei-argument-Konstruktor, der dann verwendet wird, zu erstellen
int1
mit Hilfe der copy-Konstruktor. Obwohl in der Praxis der compiler wird in der Regel optimieren diese zusätzliche Kopie, die es immer noch nicht funktionieren, wenn Sie Ihre Kopie-Konstruktor privat ist, in der Erwägung, dass die zweite braucht man nur die zwei-argument-Konstruktor (konnte man sogar sehen dies als Nachteil).Nun aber zu der eigentlichen standard-Definitionen von explizite und implizite. Ein explizite Konstruktor-Aufruf ist jeder Konstruktor-Aufruf werden Sie, gut, explizit zu nennen. Praktisch gesprochen, immer dann, wenn Sie die Klammer-syntax
()
um ein Objekt zu erstellen, die Sie der explizite Aufruf eines Konstruktors, ansonsten ist es ein implizite Konstruktor-Aufruf (so zu sagen, wird getan hinter den kulissen durch den compiler):Also nur die Konstruktoren aufgerufen werden kann implizit sind die Standard-construtor und alle ein-argument-Konstruktoren (einschließlich kopieren und verschieben von Konstruktoren). Ein besonderes problem in diesem Zusammenhang sind ein-argument-Konstruktoren nicht kopieren/verschieben Konstruktoren:
Dieser kann der compiler imlicitly rufen Sie den Konstruktor zum konvertieren von Typen, damit jeder
int
implizit konvertierbarinteger
:Verbieten, ein solches Verhalten würden Sie haben, um die Konstruktor
explicit
:Die nur erlaubt es, genannt zu werden explizit (z.B.
func(integer(42))
) (aber ich denke, Sie wussten schon). Dies hat den Vorteil, dass es nicht vorstellen unbemerkten/ungewollten Konvertierungen hinter den kulissen, die kann dazu führen, alle Arten von schwer zu finden, Probleme und Unklarheiten in Bezug auf überlast-Auflösung. Es ist daher üblich, das mark keine Konvertierung Konstruktoren (ein-argument-nicht-kopieren/verschieben Konstruktoren)explicit
, und die meisten wahrscheinlich auch der Grund, warum C++11 endlich eingeführtexplicit
konvertierungsoperatoren.Also zu summieren, entsprechend Ihrer definition und Beispiel, gibt es wirklich keinen Vorteil bei der Verwendung von
integer int1 = integer(1, 100);
stattinteger int1(1, 100);
, aber es macht einen (in der Regel irrelevant) Unterschied.Aber nach den standard-Definitionen, explizite Konstruktor-Aufrufe haben viele Vorteile gegenüber implizite, da der einzige Weg, um tatsächlich bauen gemeinsam ein Objekt explizit ist zu verwenden, na expliziten Konstruktor-Aufruf, in der Erwägung, dass implizite Konstruktor-Aufrufe sind nur hinter den kulissen in bestimmten Situationen und nur Arbeit für den null - und ein-argument-Konstruktoren (wie aschepler bereits darauf hingewiesen). Und explizit Kennzeichnung Konvertierungs-Konstruktoren als
explicit
hat den Vorteil, verhindert unerwünschte implizite Konvertierungen hinter die kulissen.mplicit constructor calls are only done behind the scenes in certain situations and only work for one-argument constructors(for zero argument i get it
...bitte editieren ur anser mit diesem zuexplicit
.(...)
für die Schaffung eines Objekts, das betrachtet wird, eine explicit Konstruktor aufrufen, indem Sie die standard-definition des Wortes explicit (und im Gegensatz zu der definition in deinem Beispiel-code). Das einzige mal, wenn ein Konstruktor-Aufruf ist genannt/benannt/angesehenimplicit
durch die standard-Definitionen ist, wenn es geschieht hinter den kulissen durch den compiler, ohne Sie ausdrücklich erstellen Sie ein neues Objekt. Sointeger int1(whatever);
wird immer dann aufgerufen, eineexplicit constructor call
- entgegen Ihrer eigenen definition.explicit
). Die sind alle ein-argument-Konstruktoren.void func(integer)
um die(int,int)
-Konstruktor aufgerufen werden, implizit? Sie können nicht nennen es einfachfunc(1, 100)
können Sie nur (implizit) konvertieren one - Objekt eines Typs in einem - Objekt von einem anderen Typ.Aufruf von Konstruktoren explizit erlauben, Sie auf Objekt erstellen mit Argumenten, anstatt mit den default-Konstruktor.
Gibt es drei Möglichkeiten, wie ein Konstruktor aufgerufen werden kann:
=
oder indem er eine implizite Konvertierung von Typ das argument zu Ihrer Klasse.Welche davon Sie verwenden können, in einem bestimmten Kontext abhängt, auf die Konstruktoren, die Sie aufrufen.
Foo f;
. Nie Versuch zu nennen, einen Konstruktor ohne Argumente explizit auf, wieFoo f();
wird deklarieren eine Funktion!Foo f = 42;
oderFoo f(42)
.explicit
Schlüsselwort verbietet implizite Konvertierung durch schreibenFoo f = std::string("abc");
oderfunction_taking_foo(function_returning_string());
.Ich hasse es dies zu sagen, weil es ist so pervers, aber es gibt eine weitere Möglichkeit, um explizit den Konstruktor aufrufen.
Den Konstruktor explizit aufgerufen, an einem bereits errichteten Objekt.
Hier habe ich gebaut (explizit) eine Instanz von integer. Dann habe ich explizit aufgerufen, der Destruktor. Dann habe ich explizit den Konstruktor wieder. Ich nehme an, Sie könnten mit diesem idiom in der Prüfung. Ich kenne keine Stelle in der Norm, die es verbietet. Es funktioniert in Visual Studio 2010. Habe ich noch nicht getestet, eine wirklich Breite Palette von Compilern.
Diese Anrufe sind explizit für große Werte von 'explicit'.
Wenn Sie eine Funktion, die eine Referenz auf ein Objekt der Klasse, und übergeben Sie es einem anderen Typ als Ihr Objekt der Konstruktor Ihrer Klasse zu konvertieren, dass die Art auf ein Objekt der Klasse ist. Alle ein-argument-Konstruktor wird genauso behandelt wie ein Konvertierungs-Konstruktor. Wenn erklären Sie, dass der Konstruktor explicit, dann übergeben Sie eine andere Art die anderen als Ihr Objekt, die Funktion wird nicht wandeln es und der compiler wird einen Fehler zurückgeben,