Komplettering för Augustitentan
- Inlämningsdatum Inget inlämningsdatum
- Poäng 0
- Lämnar in en textimatningsruta eller en filuppladdning
Många studenter klarade delar av tentan men inte hela och erbjuds nu möjlighet att komplettera. Kompletteringen sker online och det går bara att komplettera till godkänt. Om du vill ha högre betyg så behöver du skriva tentan 2019.
Första uppgiften (uppgift 0) är obligatorisk för alla. Gör sedan de kompletteringsuppgifter (1-5) som du fått 'K' markerat på din skriftliga tentamen.
Kompletteringsuppgift 0
Rätta de första 5 uppgifterna på din tenta (inte betygshöjande uppgiften, även om du har gjort den) och kommentera alla fel och småfel som du hittar. Reflektera över och kommentera vad som är rätt och fel. Den här behöver vara bra för att få godkänd komplettering. Bifoga din rättade tenta när du skickar in.
Kompletteringsuppgift 1
Studera följande kod:
struct widget {
const widget & operator=(const widget& rhs) const;
};
A) Förklara vad referenserna betyder och vad som händer om man tar bort dem.
B) Som koden ser ut ovan så är det en olämplig deklaration av en tilldelningsoperator. Varför det?
C) Ge exempel på en funktion där det är lämpligt att returnera en const-referens.
D) Ge exempel på en funktion där det är lämpligt att returnera en skrivbar referens.
Kompletteringsuppgift 2
Om du har fått komplettering på uppgift 2 så behöver du lösa denna uppgift:
Om du kör den här koden...
#include <iostream> using namespace std; struct base { int all_your_base; base(): all_your_base(0) {} base(int rhs): all_your_base(rhs) {} void operator=(const base& rhs) { cout << "base::operator=" << endl; } }; struct derived: public base { int are_belong_to_us; derived(): base(1), are_belong_to_us(2) {} }; int main() { base b; derived d; b = b; d = d; b = d; cout << b.all_your_base << endl; cout << d.all_your_base << endl; cout << d.are_belong_to_us << endl; return 0; }
...så skriver den ut detta...
base::operator= base::operator= base::operator= 0 1 2
Förklara i detalj rad för rad varför. Vilka metoder har anropats?
Kompletteringsuppgift 3
Klistra in nedanstående kod på Godbolt Links to an external site..
int square(int num) {
return num * num;
}
struct A{
int x;
virtual void foo() {
x += 1;
}
};
struct B:A{
void foo() {
x = 2;
}
};
int main() {
B b;
b.foo();
A* a = &b;
a->foo();
square(42);
return 0;
}
Studera skillnaden av de tre anropen i koden ovan och redogör för var i koden det är dynamisk bindning och vad det gör för skillnad i assemblerkoden. Du behöver inte kunna assembler för att lösa uppgiften, men räkna antalet instruktioner och försök uppskatta skillnaden i kostnad.
Kompletteringsuppgift 4
A) Vad är problemet med denna kod?
int main() {
int* v = new int[1000];
int* alias = v;
delete alias;
}
int foo(int* v) { for(int i=17; i<1000; i++) { v[i] = v[i+1]; } for(int i=17; i<1000; i++) { v[i+1] = v[i]; } }
Vad är skillnaden på de båda felen? Vilket fel är värst, enligt dig? Diskutera och motivera ditt svar!
Kompletteringsuppgift 5:
Skriv en templatiserad funktion som tar in 4 iteratorer till början och slutet av två itererbara behållare. Behållarna innehåller en okänd typ som går att jämföra med !=. Funktionen ska returnera hammingavståndet Links to an external site. mellan innehållet i de båda behållarna.