Rückgabe von const 'diesem' Zeiger

8

Wenn this ein Const-Zeiger auf das Objekt der Klasse ist, wie können Sie einen Const-Zeiger von einem nichtkonstanten Rückgabetyp zurückgeben?

%Vor%     
user963241 26.12.2010, 05:24
quelle

4 Antworten

9

Zunächst ist this kein "const pointer". Woher hast du diese seltsame Idee? Der Zeiger this hat einen skalaren Typ und ist kein Lvalue, was bedeutet, dass er nicht "const" oder "non-const" sein kann. Zeiger this ist ein rvalue und kann nicht geändert werden.

Zweitens ist der Code in Ihrer Frage gültig, unabhängig davon, ob der betreffende Zeiger const ist oder nicht. Zum Beispiel ist der folgende Code genau aus dem gleichen Grund gültig:

%Vor%

Was in diesem Fall zurückgegeben wird, ist eine vollständig unabhängige Kopie des ursprünglichen Zeigerwerts. Es spielt keine Rolle, ob p const ist oder nicht - eine Kopie von const Wert zu machen, verletzt in keiner Weise seine Konstanz.

Dies ist genau das, was Sie in Ihrem Codebeispiel getan haben - Sie geben eine Kopie des Wertes von this zurück. Warum interessiert es dich überhaupt, ob this const ist oder nicht?

    
AnT 26.12.2010, 05:52
quelle
2

Wenn die Elementfunktion nicht const-qualifiziert ist (z. B. T* func() const anstatt nur T* func() ), ist this vom Typ T* .

this ist nicht selbst modifizierbar (also kann man this nicht zuweisen), aber es ist nur ein Zeiger auf ein Objekt vom Typ T wie jedes andere und kann als solches verwendet werden.

    
James McNellis 26.12.2010 05:29
quelle
1

AndreyT lieferte die Erklärung und hier ist die Referenz.

Aus der Standarddokumentation 9.3.2.1 Der this-Zeiger ,

  

Im Rumpf einer nicht statischen (9.3) Elementfunktion, dem Schlüsselwort ist dies ein rvalue-Ausdruck, dessen Wert die Adresse ist   des Objekts, für das die Funktion aufgerufen wird. Der Typ in einer Memberfunktion einer Klasse X ist X *. Wenn das Mitglied   Funktion wird als const deklariert, der Typ ist const X *, wenn die Memberfunktion als flüchtig deklariert ist, der Typ von   Dies ist flüchtig X *, und wenn die Elementfunktion als const volatile deklariert ist, ist der Typ const volatile   X *.

Dies erklärt die Frage, die Sie gestellt haben, und den Kommentar, den Sie zu AndreyT gemacht haben.

Hoffe, dass dieser auch hilft.

    
liaK 27.12.2010 07:15
quelle
0

Ein Zeiger ist kein Objekt, daher spielt es keine Rolle, ob der Zeiger const ist, wenn es ein Rückgabewert ist. Bedenken Sie Folgendes:

%Vor%

Tatsächlich gibt es keinen Unterschied zwischen f () und g ().

Aber es kann einen Unterschied machen, wenn Sie alle "int" durch einen anderen Namen einer Klasse ersetzen. "const" kann Sie vor einem Fehler, z.B. wenn Sie keinen Kopierkonstruktor richtig schreiben.

%Vor%

Wenn Sie also verhindern wollen, dass Daten des Objekts durch Bezugnahme auf den Rückgabewert geändert werden, benötigen Sie:

%Vor%     
RnMss 26.12.2010 10:14
quelle

Tags und Links