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 30
Referenssejä 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.