La differenza tra * s.pd e s-pd

1

Stavo leggendo dei costruttori di copia per le strutture e ho trovato questo esempio:

#include <iostream>
#include <string>
using namespace std;

struct SomeData {
    int * pd;
    string id;
    SomeData(SomeData & ref) {
        cout << "Copy Constructor called" << endl;
        pd = new int (*ref.pd);
        id = "Copy Constructed";
    }
    SomeData(string name) {
        pd = new int(0);
        id = name;
        cout << "Constructor for " << id << endl;
    };
    ~SomeData() {
        cout << "Destructor for " << id << endl;
        delete pd;
    }
};

int main() {
    SomeData s("First");
    *s.pd = 9;
    SomeData s2=s;
    cout << *s2.pd << endl;
    return 0;
}

in main , si accede al membro pd di SomeData utilizzando la dereferenziazione, ma perché è così, non è il modo corretto è

s->pd=9;

perché è stato scritto così nell'esempio?

    
posta Warrior4just 24.12.2014 - 20:43
fonte

1 risposta

5

Questo è un esempio di precedenza dell'operatore che non dà abbastanza i risultati che ci si aspetta. L'esempio ha il codice

*s.pd = 9;

che è equivalente al seguente:

*(s.pd) = 9;

Si interroga perché non è stato scritto come

s->pd = 9;

ma questo è equivalente a

(*s).pd = 9;

Cioè, il codice nell'esempio denota il valore di pd che è un membro di s, mentre il codice che stai chiedendo riguardo a dereferenze s (che non è legale come s non è un puntatore e non ha un sovraccarico per l'operatore "- >").

Questo perché ".", l'operatore di selezione membro si lega più strongmente di "*", l'operatore di dereferenziazione.

Vedi link per un elenco completo; "" ha la precedenza di 2, mentre "*" ha la precedenza di 3. Solo "::" si lega più strongmente di ".".

    
risposta data 24.12.2014 - 20:57
fonte

Leggi altre domande sui tag