web-dev-qa-db-ger.com

Standard-Kopierkonstruktor

Kann der (implizite) StandardKopierkonstruktor für eine Klasse aufgerufen werden, die bereits benutzerdefinierter Konstruktor aber das ist nicht der Kopierkonstruktor ?

Wenn es dann möglich ist, nehmen wir an, wir definieren den Kopierkonstruktor für die Klasse explizit . Kann jetzt der (implizite) Standardkonstruktor aufgerufen werden?

32
sourabh912

Lassen Sie uns zunächst unser Vokabular etwas klären. Ein Standardkonstruktor ist ein Konstruktor, der ohne Argumente aufgerufen werden kann. Ein Kopierkonstruktor ist ein Konstruktor, der mit einem einzigen Argument desselben Typs aufgerufen werden kann. In Anbetracht dessen wäre ein "Standard-Kopierkonstruktor" ein Konstruktor mit einer Signatur in etwa wie folgt:

class MyClass
{
public:
    static MyClass ourDefaultInstance;
    //  default copy constructor...
    MyClass( MyClass const& other = ourDefaultInstance );
};

Irgendwie glaube ich nicht, dass Sie das gemeint haben. I think Sie fragen nach einem implizit deklarierten oder implizit definierten Kopierkonstruktor. ein Kopierkonstruktor, dessen Deklaration oder Definition implizit vom Compiler bereitgestellt wird. Der Compiler wird die Deklaration immer bereitstellen, es sei denn, Sie geben eine Deklaration von etwas an, das als Kopierkonstruktor betrachtet werden kann. Das Bereitstellen anderer Konstruktoren hindert den Compiler nicht daran, implizit einen Kopierkonstruktor zu deklarieren.

Dies unterscheidet sich vom Standardkonstruktor --any Benutzerdefinierter Konstruktor verhindert, dass der Compiler implizit einen Standardkonstruktor deklariert. Dies bedeutet, dass der Compiler einen Standardkonstruktor nicht implizit deklariert, wenn Sie einen benutzerdefinierten Kopierkonstruktor haben.

Der zweite wichtige Punkt ist, dass Sie keine Konstruktoren aufrufen. Der Compiler ruft sie in bestimmten gut definierten Kontexten auf: hauptsächlich Variablendefinition und Typkonvertierung. Der Compiler kann nur deklarierte Konstruktoren aufrufen (einschließlich der implizit deklarierten). Wenn Sie also einen benutzerdefinierten Konstruktor (Kopie oder auf andere Weise) haben und keinen Standardkonstruktor definieren, kann der Compiler den Konstruktor nur in Kontexten aufrufen, in denen er Argumente zum Aufrufen hat.

Um zusammenzufassen, was ich denke, dass Ihre Fragen sind: Der Compiler wird einen impliziten Kopierkonstruktor bereitstellen, selbst wenn die Klasse andere benutzerdefinierte Konstruktoren hat, vorausgesetzt, keiner dieser Konstruktoren kann als Kopierkonstruktor betrachtet werden. Und wenn Sie einen benutzerdefinierten Kopierkonstruktor angeben, wird der Compiler nicht einen implizit deklarierten Standard-Kopierkonstruktor bereitstellen.

90
James Kanze

http://www.cplusplus.com/articles/y8hv0pDG/

Der Standard-Kopierkonstruktor ist vorhanden, wenn Sie keinen definiert haben. Sie können also den Standard-Kopierkonstruktor aufrufen, wenn Sie keinen Kopierkonstruktor definiert haben. Wenn Sie jedoch einen Kopierkonstruktor in Ihrer Klasse definieren, können Sie den Standardkonstruktor nicht aufrufen.

11
CrazyCasta

Es gibt keinen Standard-Kopierkonstruktor. Es gibt Standardkonstruktoren und Kopierkonstruktoren, und das sind verschiedene Dinge.

Der implizit definierte Kopierkonstruktor (von dem ich denke, dass Sie das mit "Standard-Kopierkonstruktor" meinen) kopiert nicht statische Member des Klassentyps mit ihrem Kopierkonstruktor, nicht mit ihrem Standardkonstruktor. Der implizit definierte Kopierkonstruktor wird verwendet, wenn Sie keinen eigenen Kopierkonstruktor definieren.

3
NullPoiиteя