Tässä harjoituksessa kerrataan mitä tarkoittavat termit muistiosoite ja osoitin l. pointteri. Lisäksi tutustutaan uuteen käsitteeseen referenssi l. viittaus .
C++-ohjelmoinnissa referenssi on viittaus olemassa olevaan muuttujaan. Se toimii aliaksena, eli referenssi ja alkuperäinen muuttuja viittaavat samaan muistipaikkaan. Referenssi määritellään käyttämällä &-operaattoria. Referensseillä on seuraavat ominaisuudet:
int a = 10; int &ref = a; // ref on viittaus muuttujaan a ref = 20; // nyt myös a: arvo on 20 int *pointer=&a; *pointer=30; // nyt myös a:n arvo on 30Referenssejä käytetään usein funktioiden parametreina ja palautusarvoina tehokkuuden parantamiseksi.
HUOM! Luo kullekin luokalle erillinen h-tiedosto ja cpp-tiedosto.
Luo C++-projekti nimeltään h5
a:n arvo on: 5 ja osoite on: 0x5449fff84c
Pointterin osoittama osoite on: 0x5449fff84c Pointterin osoittaman muistipaikan arvo on: 5
refA osoittaa osoitteeseen on: 0x5449fff84c refA:n osoittaman muistipaikan arvo on: 5
Nyt sinun tulisi havaita mitä eroa on seuraavilla:
class ClassA1 { private: ClassB objectB; public: ClassA1(ClassB); //Luodaan kopio ClassB-luokan oliosta string getBinfo(); void setBinfo(string); };Ja cpp-tiedostossa koodi:
ClassA1::ClassA1(ClassB value):objectB(value) { } string ClassA1::getBinfo() { return objectB.getInfo(); } void ClassA1::setBinfo(string value) { objectB.setInfo(value); }
ClassB objB; objB.setInfo("Olion B asettama info"); ClassA1 objA1(objB); objA1.setBinfo("Olion objA1 asettama info"); cout<<"objB: "<<objB.getInfo()<<endl; cout<<"objA1: "<<objA1.getBinfo()<<endl;
class ClassA2 { private: ClassB &refB; public: ClassA2(ClassB&); //Annetaan argumenttina B-luokan olion osoite string getBinfo(); void setBinfo(string); };Ja cpp-tiedotosssa koodi:
ClassA2::ClassA2(ClassB &value):refB(value) { } string ClassA2::getBinfo() { return refB.getInfo(); } void ClassA2::setBinfo(string value) { refB.setInfo(value); }
ClassB &refB=objB; ClassA2 objA2(refB); objA2.setBinfo("Olion Agr asettama info"); cout<<"objB: "<<objB.getInfo()<<endl; cout<<"objA2 "<<objA2.getBinfo()<<endl; cout<<endl;
Edellisen vaiheen tarkoitus on havainnollistaa, että myös alkuperäisen B-olion(objB) data muuttuu, kun muokkaat A2-olion dataa.
Tehtävässä voidaan siis havaita, että kun oliolle A annetaan argumenttina olio B, niin A ei voi vaikuttaa olion B dataan.
Jos oliolle A annetaan argumenttina olion B osoite, niin A:n muokkaus muuttaa B:n dataa.