Tässä harjoituksessa kerrataan mitä tarkoittavat termit muistiosoite ja osoitin l. pointteri. Lisäksi tutustutaan uuteen käsitteeseen referenssi.
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 on 20Referenssejä käytetään usein funktioiden parametreina ja palautusarvoina tehokkuuden parantamiseksi.
HUOM!: Luo kullekin luokalle erillinen h-tiedosto ja cpp-tiedosto.
a:n arvo on: 5 ja osoite on: 0x5449fff84c b:n arvo on: 10 ja osoite on: 0x5449fff848
Pointterin osoittama osoite on: 0xb821dff67c Pointterin osoittaman muistipaikan arvo on: 5
Pointterin osoittama osoite on: 0x522d5ff938 Pointterin osoittaman muistipaikan arvo on: 10
refA osoittaa osoitteeseen on: 0xc8139ff8bc refA:n osoittaman muistipaikan arvo on: 5
Nyt sinun tulisi havaita mitä eroa on seuraavilla:
class AssosiationA { private: ClassB objectB; public: AssosiationA(ClassB); string getBinfo(); void setBinfo(string); };Ja cpp-tiedostossa koodi:
AssosiationA::AssosiationA(ClassB value):objectB(value) { } string AssosiationA::getBinfo() { return objectB.getInfo(); } void AssosiationA::setBinfo(string value) { objectB.setInfo(value); }
ClassB objB; objB.setInfo("Olion B asettama info"); AssosiationA objAss(objB); objAss.setBinfo("Olion objAss asettama info"); cout<<"Assosiaatio esimerkki:"<<endl; cout<<"objB: "<<objB.getInfo()<<endl; cout<<"objAss: "<<objAss.getBinfo()<<endl;
class AggregationA { private: ClassB &refB; public: AggregationA(ClassB&); string getBinfo(); void setBinfo(string); };Ja cpp-tiedotosssa koodi:
AggregationA::AggregationA(ClassB &value):refB(value) { } string AggregationA::getBinfo() { return refB.getInfo(); } void AggregationA::setBinfo(string value) { refB.setInfo(value); }
cout<<"Aggregaatio esimerkki:"<<endl; ClassB &refB=objB; AggregationA objAggr(refB); objAggr.setBinfo("Olion Agr asettama info"); cout<<"objB: "<<objB.getInfo()<<endl; cout<<"objAggr "<<objAggr.getBinfo()<<endl; cout<<endl;
Tehtävässä voidaan siis havaita, että kun oliolle A annetaan kopio oliosta B, niin A ei voi vaikuttaa olion B dataan.
Jos oliolle A annetaan referenssinä olion B osoite, niin A:n muokkaus muuttaa B:n dataa.