Citat:
Så som du skriver stämmer. Om vi har en funktion som tar en vector (som finns i standardbiblioteket i C++, men inte i C om det är det du jobbar med) av doublesOkej intressant tack för ditt tilläg.
Nästa fråga:
Vad är skillnaden mellan värdeanrop (call-by-value) och referensrop (call-by-reference)?
Nästa fråga:
Vad är skillnaden mellan värdeanrop (call-by-value) och referensrop (call-by-reference)?
Tror jag vet, men inte hur jag ska formulera mig riktigt. Som jag förstår det, när man anropar en funktion med "call-by-value" kan funktionen inte påverka något utanför funktionen. Om man nu inte skulle returnera något antar jag. Men call-by-reference anropar den exakta variabeln man vill åt och funktionen kan ändra på saker utan för sig själv. Dåligt formulerat någon annan kan säkert bättre.
Kod:
kommer en kopia av Vector göras när funktionen anropas. Inne i funktionen jobbar vi alltså då endast med denna kopia, varvid förändringar vi gör med Vector inne i funktionen inte påverkar Vector utanför funktionens scope. Detta är alltså värdeanrop.void ComputeSum(std::vector<double> Vector);
Om vi istället har en funktion
Kod:
görs ingen kopia av Vector. Vi jobbar alltså direkt med Vector i minet; alla förändringar vi gör med Vector i funktionen följer med sedan när vi lämnar funktionens scope. Detta är alltså referensanrop. void ComputeSum(std::vector<double>& Vector);
Jobbar man med en std::vector som rymmer ett stort antal element är det alltså ineffektivt att arbeta med värdeanrop eftersom vi måste kopiera samtliga element varje gång funktionen anropas. Om man endast vill läsa data utan att riskera att modifiera argumentet vid referensanrop kan man använda sig av const, t ex
Kod:
void ComputeSum(const std::vector<double>& Vector);