Perché il C ++ "questo" è mal progettato?

3
  1. Per ogni a e b che sono puntatori non-const dello stesso tipo, puoi fare a = b; , giusto?

  2. All'interno delle funzioni membro non-const esiste la parola chiave this , che è un puntatore non-const. Quindi logico se b è lo stesso tipo di this puoi anche fare this = b; giusto?

sbagliato.

Non puoi fare this = b; , perché this usa la sintassi del puntatore ma logicamente this è un riferimento!

Ma perché sulla terra è this sintatticamente un puntatore, ma logicamente riferimento?

Questo comportamento strano può essere corretto nel prossimo standard C ++, introducendo una nuova parola chiave, ad esempio me che sarà un riferimento non solo logicamente ma anche sintatticamente?

(Vedi anche il mio tentativo di risolvere questo qui: " È una buona idea" #define me (* this) "? ")

    
posta user3123061 15.07.2014 - 11:59
fonte

3 risposte

30

this è (come nullptr ) un puntatore costante ; i dati puntati sono const se e solo se this appare nel corpo di una funzione membro const .

Non puoi cambiare un puntatore costante, come non puoi cambiare un valore letterale costante come 23 .

Quindi assegnazione a this come

this = p;  // WRONG

è vietato per gli stessi motivi l'assegnazione a nullptr è proibita:

nullptr = 0; // wrong
    
risposta data 15.07.2014 - 12:04
fonte
0

this NON è progettato male. Non hai quasi mai variabili locali con lo stesso nome dei nomi dei membri della classe. Mentre questa costruzione si verifica in costruttori per oggetti POD o quasi POD, il linguaggio ha un modo migliore di affrontare questo. Ecco:

#include <stdio.h>

class A {
    public:
        A(int m1, int m2) : m1(m1), m2(m2) {}
        int m1;
        int m2;
};

int main()
{
    A a(1, 2);
    printf("%d, %d\n", a.m1, a.m2);
}

Sono sicuro che possiamo essere d'accordo sul fatto che questa dimostrazione sia piena di orrori, ma il punto è ovvio. Il costruttore ha variabili locali con lo stesso nome dei membri e inizializza i membri con lo stesso nome delle variabili locali. Puoi eseguire questo programma e ottenere l'output "1, 2".

Inoltre, in C ++ ci aspettiamo che possiamo dichiarare funzioni con nomi di parametri validi (per suggerimenti) e nomi errati per l'implementazione effettiva. Questo può essere fatto anche per le funzioni inline se ci preoccupiamo di dichiararle separatamente piuttosto che fisicamente nella definizione della classe.

Per tutti questi motivi, una funzione membro ha raramente bisogno di accedere alla sua classe in modo esplicito, ma solo il suo puntatore, quindi la parola chiave this è un puntatore.

Artefatto storico: this non era una volta const e potrebbe essere assegnato a. Questa è stata una cattiva idea.

    
risposta data 31.12.2017 - 21:13
fonte
0

Si può fare un argomento secondo cui this è un po 'maldestro.
Avere un self -reference, invece, sarebbe probabilmente un po 'più naturale al giorno d'oggi:
Il suo tipo potrebbe quindi contenere un po 'più di informazioni rispetto al tipo di this can, ovvero:

  1. Indica se la funzione membro è stata garantita richiamata su un riferimento di rvalore e
  2. che in realtà si riferisce sempre a un oggetto.

Tuttavia, quando C ++ ha ottenuto dei riferimenti (inventati per il sovraccarico dell'operatore, penso), la decisione su this era già una storia antica. E la retrocompatibilità non fa ridere.

    
risposta data 26.08.2018 - 17:57
fonte

Leggi altre domande sui tag