Hva er meningen med ledende strek i en C ++ konstruktør?

stemmer
5

OK Jeg er ikke en veldig erfaren C ++ programmerer, men jeg lurte på hva er betydningen av de understrek i argumentene til følgende konstruktør?

class floatCoords
 {
 public:
  floatCoords(float _x, float _y, float _width, float _height)
   : x(_x), y(_y), width(_width), height(_height)
  {

  }
  float x, y, width, height;
  ...
Publisert på 19/10/2009 klokken 21:19
kilden bruker
På andre språk...                            


8 svar

stemmer
1

De er bare navn på parametere som sendes inn. De måtte matche medlem variabler og brukes til initializers.

Det er ingen spesiell betydning - det er bare en konvensjon noen mennesker kan bruke.

Svarte 19/10/2009 kl. 21:20
kilden bruker

stemmer
9

Ikke noe spesielt. Han kalte det sånn å skille mellom medlemsvariabler og parameternavn.

Strek er et gyldig tegn i C ++ identifikatorer.

Svarte 19/10/2009 kl. 21:21
kilden bruker

stemmer
0

De har ikke en syntaktisk mening. Men hvis du har en haug med felt (f.eks x, y, width, og height), er det en felles konvensjon for å nevne konstruktøren parametre som initialiserer dem med feltnavn pluss en ledende strek.

Svarte 19/10/2009 kl. 21:21
kilden bruker

stemmer
0

Hensikten med disse strek er å skille den parameter variable float _xog medlemsvariabel float x. Syntaktisk, det er ingen spesiell betydning lagt på grunn av understrek. Jeg personlig foretrekker å prefikset alle parametere med a_ og prefiks alle medlemsvariabler med m_når jeg trenger å kode C ++.

Så når jeg kommer inn i en situasjon der jeg må mikse og matche lokale, medlems, og parameter variabler, jeg vet hvilke som jeg arbeider med.

int y = a_x * 2;
m_x = y + 3;
Svarte 19/10/2009 kl. 21:21
kilden bruker

stemmer
8

Det er bare en praktisk navnekonvensjon, det betyr ingenting for språket. Bare vær sikker på at du ikke følger det med en stor bokstav: Hva betyr dobbel understrek (__const) betyr i C?

Svarte 19/10/2009 kl. 21:22
kilden bruker

stemmer
8

Mest sannsynlig, forfatteren av koden prøvde å unngå potensielle konflikter mellom data medlemsnavnene og konstruktør parameternavn i initializer listen. Ganske sannsynlig, forfatteren var ikke klar over det faktum at C ++ oppslag regler sørge for at konflikten ikke vil forekomme uansett. Dvs følgende kode vil også produsere forventede resultater

class floatCoords    {
    public:
        floatCoords(float x, float y, float width, float height)
                : x(x), y(y), width(width), height(height)
        {
        }
        float x, y, width, height;
        ...

selv om det kan vise seg å være forvirrende for en uforberedt leser.

Selvfølgelig, inne i kroppen til konstruktøren, vil parameternavn skjule medlemsnavnene, og dermed gjør det nødvendig å bruke this->...eller kvalifiserte navn for å få tilgang til data medlemmer. Sjansen er forfatteren av koden prøvde å unngå det også.

Svarte 19/10/2009 kl. 21:24
kilden bruker

stemmer
0

fordi hvis du vil kalle den float x, flyte y osv du ikke kunne få tilgang til selve felt av klassen fordi de har samme navn.

det har ingenting å gjøre med språket, det er bare en konvensjon av selve programmerer (for å gjøre koden mer opplagt, tror jeg)

Svarte 19/10/2009 kl. 21:24
kilden bruker

stemmer
2

Dette er bare konvensjon av variable navngiving at ulike mennesker / institusjoner anta. Dette kan virke unødvendig ved første øyekast, men er faktisk veldig nyttig når du leser og skrive kode, spesielt når du har parametere og medlem variabler som har samme navn. Eg kan du vanligvis har disse tre tilfeller:

class A {
  void foo(int age_) { //parameter
    int age = 18; //local scope
    if (age_ > age) cout << legal << endl;
  }
  int _age; //member
};

I eksemplet ovenfor:

  • _variable - betyr at dette er en klasse medlemsvariabel
  • variable_ - betyr at dette er en parameter til en funksjon
  • variabel - betyr at dette er bare en vanlig variabel lokale til funksjonen omfang
Svarte 19/10/2009 kl. 21:27
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more