Toon posts:

[C++] & teken na waardetype

Pagina: 1
Acties:
  • 154 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik vraag het maar hier:
Ik ben al een aardig eindje op weg met C++ met een zeer goede tutorial, alleen ik snap niet wat men bedoelt met het &-teken na een waardetype, in dit geval een class.
Dit staat in de tutorial:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// this
#include <iostream.h>

class CDummy {
  public:
    int isitme (CDummy& param); //<-- wat is param voor variabele? wat bevat het?
};

int CDummy::isitme (CDummy& param)
{
  if (&param == this) return 1;
  else return 0;
}

int main () {
  CDummy a;
  CDummy* b = &a;
  if ( b->isitme(a) )
    cout << "yes, &a is b";
  return 0;
}


deze is bedoelt om "this" uit te leggen, maar het was de duidelijkste vorm van een script waar dit instaat. Pointers etc. en het adress of (&) tekentje ervoor snap ik allemaal wel. Maar hier wordt geen woord over gezegd, dus ik denk dat ik iets over het hoofd zie.

[ Voor 6% gewijzigd door NMe op 12-05-2005 22:04 . Reden: Code tags ]


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 22:27

Reptile209

- gers -

Kwestie van uitlijning. (Uit het blote bolletje, C is een tijdje terug)
C++:
1
CDummy& param
is een parameter met de naam 'param' van het type "addres naar een CDummy-object" voor de functie isitme() (die weer een member van de class CDummy is). Je zou ook kunnen schrijven:
C++:
1
CDummy &param

De functie in kwestie krijgt dus een adres naar een ding van zijn eigen type mee, via this wordt gekeken of het het object zelf is, of een andere kopie van hetzelfde type.

offtopic:
Kijk eens naar de [ code]-tags :)

[ Voor 22% gewijzigd door Reptile209 op 12-05-2005 21:04 ]

Zo scherp als een voetbal!


  • TaXaN
  • Registratie: April 2001
  • Laatst online: 08-09-2023
Nee, dit is geen adres, dit is een reference. Zoek die term maar eens op in je tutorial.

Trouwens, #include <iostream.h> is geen Standaard C++, je moet <iostream> hebben. Zeker dat die tutorial wel echt zo goed is?

A polar bear is a rectangular bear after a coordinate transformation.


Verwijderd

Topicstarter
dus param bevat in dit geval het adres van a.
this verwijst naar het adres van het desbetreffende object, a.

waarom controleren ze dat dan met:
C++:
1
if(&param == this) //als adres van adres van a == this (lijkt mij)


want als wat ik hierboven zeg klopt, moet dat zijn:

C++:
1
if(param == this)


dit is dus fout, want dat staat vast. Hoe is het dan wel?

EDIT:

Ik heb het opgezocht, het is dus gewoon een synoniem van een object. Dat gebruiken ze hier dus i.p.v. een kopie van het object, omdat je het dan ook daadwerkelijk over de enige echte "a" hebt. toch? en als je param zou veranderen, verandert a ook, want net als met een pointer refereert hij ergens naar.
als je *p verandert verandert hetgene wiens adres p naar wijst immers ook.
tnx.

[ Voor 40% gewijzigd door NMe op 12-05-2005 22:04 ]


Verwijderd

Topicstarter
en dat
<iostream.h>

<iostream> moet zijn, borland vindt van niet... Hij doet het nl. niet op die manier.

[ Voor 30% gewijzigd door Verwijderd op 12-05-2005 22:01 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Verwijderd schreef op donderdag 12 mei 2005 @ 21:08:
Ik heb het opgezocht, het is dus gewoon een synoniem van een object. Dat gebruiken ze hier dus i.p.v. een kopie van het object, omdat je het dan ook daadwerkelijk over de enige echte "a" hebt. toch? en als je param zou veranderen, verandert a ook, want net als met een pointer refereert hij ergens naar.
als je *p verandert verandert hetgene wiens adres p naar wijst immers ook.
tnx.
Een reference biedt in C++ dezelfde functionaliteit als een pointer had in C, met als verschil dat je niet expliciet een pointer hoeft te gebruiken, waardoor je niet continu met * en & operators hoeft te klooien. Vaak worden aan methoden van classes constant references doorgegeven, wat geheugen bespaart, en bovendien garandeert dat het object dat je erin stopt onveranderd blijft. Een copyconstructor en een operator= werken zo bijvoorbeeld:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class MyClass {
    private:
        int myAttr1, myAttr2;
    public:
        MyClass(const MyClass & mc) {
            myAttr1 = mc.myAttr1;
            myAttr2 = mc.myAttr2;
        }

        MyClass & operator=(const MyClass & mc) {
            if (this != &mc) {
                myAttr1 = mc.myAttr1;
                myAttr2 = mc.myAttr2;
            }
        }
}


Modbreak:Ik heb ook code tags aan je posts toegevoegd. Doe je het de volgende keer zelf? :)

[ Voor 4% gewijzigd door NMe op 12-05-2005 22:05 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
waar refereert mc naar in jouw voorbeeld? Er is toch helemaal geen object van gemaakt? of maakt hij dan terplekke een instantie van die class en verwijdert hij die weer als hij klaar is?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

mc is een referentie van een object van het type MyClass dat beide functies doorkrijgen via de parameters van de betreffende methoden. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 10:04
Het is voor een beginner altijd verwarrend dat de & operator voor meerdere dingen gebruikt wordt ( als 'adres van' om het adres van een variabele te krijgen en als 'reference type', die jij hier aankaart.

Meestal worden 'reference parameters' gebruikt als je niet het hele object ( class ) by value op de stack wilt gooien ( het hele object moet dan een keer gekopieerd worden ), maar toch het originele object niet wilt veranderen. ( Het kan wel! )

Meestal zie je dan ook ( zoals in de copy constructor voorbeeld van -Nme- )
C++:
1
2
3
4
5
6
void by_const_ref_func( const ObjectType& src )
{
    int a = src.test;

    ..... code .....
}


om de waarden van src te kunnen gebruiken zonder src op de stack te kopieren, en

C++:
1
2
3
4
5
void by_pointer_func( ObjectType* dst )
{
    dst->test = 2;
    ..... code .....
}


als je in de functie iets aan dst wilt veranderen. Zo wordt het ook door de maker van C++ ( http://www.research.att.com/~bs/homepage.html ) aanbevolen.

Zoals je ziet is de reference notatie hetzelfde als de normale notatie, en bij de pointer notatie moet je de *,& en -> operators gebruiken.

Overigens kun je als je dat wilt ook in normale variabele declaraties het & teken gebruiken om aan te geven dat de variabele dezelfde is als waarmee je het ding initialiseert (want dat moet dan wel meteen). Bv zo:

C++:
1
2
3
4
5
6
7
8
9
10
11
void func( )
{
    int a = 0;
    int& b = a;    // b is een 'normale' variabele, en een alias voor a. Als b verandert, verandert a ook.
    b = 2;          // a en b zijn nu 2

    int& c;         // Dit mag niet

    int* pint = &a;   // een pointer naar a dus.
    *pint = 3;          // zowel a als b zijn nu 3
}

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:59

.oisyn

Moderator Devschuur®

Demotivational Speaker

-NMe- schreef op donderdag 12 mei 2005 @ 22:03:
[...]

Een reference biedt in C++ dezelfde functionaliteit als een pointer had in C, met als verschil dat je niet expliciet een pointer hoeft te gebruiken
En het verschil dat je een pointer kunt reassignen naar een ander adres. Bij een reference kan dat niet omdat elke verdere operatie op de variabele werkt op de feitelijke instantie waarnaar gerefereerd wordt.
farlane schreef op vrijdag 13 mei 2005 @ 10:38:
Het is voor een beginner altijd verwarrend dat de & operator voor meerdere dingen gebruikt wordt ( als 'adres van' om het adres van een variabele te krijgen en als 'reference type', die jij hier aankaart.
Vergeet de bitwise and niet ;) Maar dat terzijde

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 10:04
.oisyn schreef op vrijdag 13 mei 2005 @ 10:57:
Vergeet de bitwise and niet ;) Maar dat terzijde
Idd, die is er ook nog. :) Maar omdat die een compleet andere betekenis heeft onthoudt men dat vaak wel ( dan is er weer verwarring met de logische and ).

Ik weet van mezelf dat ik erg heb lopen prutsen met vooral het verschil tussen reference notatie en pointer notatie, terwijl het eigenlijk heel simpel is.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 04-05 13:09
farlane schreef op vrijdag 13 mei 2005 @ 12:08:
[...]

Idd, die is er ook nog. :) Maar omdat die een compleet andere betekenis heeft onthoudt men dat vaak wel ( dan is er weer verwarring met de logische and ).

Ik weet van mezelf dat ik erg heb lopen prutsen met vooral het verschil tussen reference notatie en pointer notatie, terwijl het eigenlijk heel simpel is.
Sowieso is het concept pointers voor beginners in C++ erg moeilijk. Maar als je het eenmaal doorhebt is het erg handig en duidelijk. Vind het zelf tenminste ook stuk intuïtiever dan references in Java. Je weet tenminste wanneer je een object hebt of een verwijzing naar een object.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

Topicstarter
Ik zou nu ook geen idee hebben waar je pointers voor nodig zou moeten hebben, maar dat komt wel. Toen ik met javascript begon snapte ik ook niet waarom je een variabele voor het getal 10 zou moeten gebruiken omdat je ook gewoon 10 in een keer kan gebruiken. Nu ligt dit vast ingewikkelder, maar na wat ervaring komt dat vanzelf (denk ik hoop ik)

[ Voor 3% gewijzigd door Verwijderd op 13-05-2005 19:38 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Verwijderd schreef op vrijdag 13 mei 2005 @ 19:38:
Ik zou nu ook geen idee hebben waar je pointers voor nodig zou moeten hebben, maar dat komt wel. Toen ik met javascript begon snapte ik ook niet waarom je een variabele voor het getal 10 zou moeten gebruiken omdat je ook gewoon 10 in een keer kan gebruiken. Nu ligt dit vast ingewikkelder, maar na wat ervaring komt dat vanzelf (denk ik hoop ik)
Strings en arrays zijn (bijvoorbeeld) pointers. In de meeste talen gebeurt dat intern, maar in C niet echt. C kent geen strings maar character pointers, en een array kun je benaderen met zowel a[12] als a+12. In C++ kan dit allemaal ook nog wel, maar is het (gelukkig voor veel beginners) een stuk eenvoudiger gemaakt. C++ kent wel strings, en pointers heb je minder nodig. In ruil daarvoor gebruik je dan weer references, om geheugen te besparen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Nou ja, references gebruik je ook nog wel voor OO, en in een heleboel OO ontwerpen gebruik je ook (smart) pointers. Maar pointer arithmetic is wel erg zeldzaam geworden, ja.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Als ik er weer eens niet uitkom dan kijk ik altijd hier:

Officiele cplusplus.com tutorial

Dit is een van de duidelijkste tutorials die ik ken en niet langdradig.

  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 99% gewijzigd door Eelis op 18-02-2015 19:07 ]


  • Xorgye
  • Registratie: Maart 2005
  • Laatst online: 05-10-2024
Wooow, zie meteen een heleboel nieuwe functies van C / C++
Ik heb hier net ook een paar vragen gesteld over pointers, http://gathering.tweakers.net/forum/list_messages/1036415 (probleem is al opgelost), en nu met de cross-reference uitleg snap ik het helemaal. Thnks GoT!
Pagina: 1