Tentamen i 2D1387 Programsystemkonstruktion med C++
Datum:22 oktober 2002
Hjälpmedel:Valfri lärobok i C++
Tid: 5 timmar
Skriv tydligt och ge motiveringar till dina svar. För godkänt krävs högst 25 po- äng. Max poäng är 45.
1. Betrakta följande program:
struct A {
void fnc() { std::cout << "A"; } virtual void vfnc() { std::cout << "A"; }
void print() { vfnc(); }
virtual void vprint() { fnc(); } };
struct B : public A {
virtual void vfnc() { std::cout << "B"; } virtual void vprint() { B::fnc(); }
};
A a;
B b;
A &ar = b;
a.print();
a.vprint();
ar.print();
ar.vprint();
Vad skriver programmet ut när man kör det? Motivera ditt svar. 10p 2. Mallfunktionen accumulate adderar elementen i en behållare med operator+=.
Första argumentet anger startvärde för summeringen. Exempel:
std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(4);
int a = accumulate(10, v.begin(), v.end()); // a = 17
a) Implementera accumulate. 8p
b) Varför kompilerar inte nedanstående anrop? Hur ordnar du detta på enklast
möjliga sätt? 4p
// "barbazfoo"
const char *b[] = { "bar", "baz", "foo" };
accumulate("", b + 0, b + 3);
1
3. Antag att du ska skriva en klass BigNum för godtyckligt stora heltal.
a) Ge deklarationer för följande fyra medlemsfunktioner: operator++ (pre- fix), operator++ (postfix), operator+ och operator+= (som båda lägger
till en BigNum). 4p
b) Betrakta följande typer: BigNum, BigNum &, const BigNum, const BigNum
&. När använder man dem som returtyp (ge kommentar för var och en)?
När använder man dem som argumenttyp? När bör en funktion vara const? Hänvisa till uppgift a med motivering där så är lämpligt. 6p c) Vilken är anledningen till att man gör en operator till en global funktion istället för medlemsfunktion? Är det någon av operatorerna i a som inte
går att göra global? 3p
4. Vissa funktioner ges implicit av kompilatorn när du inte implementerat dem själv.
a) Hur fungerar de implicit givna funktionerna defaultkonstruktor, kopie- ringskonstruktor, tilldelningsoperator och destruktor? 5p b) Ungefär hur ser kompilatorns implementation ut för de fyra funktionerna givet klassen nedan? Kan kompilatorn verkligen skapa kod för alla fyra
funktionerna och om inte, varför? 5p
class A {
std::string s;
public:
char * const p;
int &r;
static const int size = 1024;
char a[1024];
int i;
};
2