Tentamen i 2D1387 Programsystemkonstruktion med C++
Datum: Lördag 25 oktober 2003, 14-19 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. Maximal poäng är 45.
1. Betrakta följande program:
struct A {
A() { cout << "A()"; }
~A() { cout << "~A()"; }
A(const A &) { cout << "A(A)"; }
virtual void foo() { cout << "A::foo()"; } };
struct B : public A {
virtual void foo() { cout << "B::foo()"; } };
A a;
B t;
B b = t;
A aa[3] = {a, b};
A &ar1 = aa[1];
A &ar2 = b;
ar1.foo();
ar2.foo();
Vad skriver programmet ut när man kör det? Ge en kommentar för varje rad
för att motivera ditt svar. 10p
2. Funktionen subseq svarar på frågan om en sekvens är en delsekvens av en annan. Exempel: {1 2 3} är en delsekvens av {1 2 3 4} och {2 4} är en del- sekvens av {1 2 3 4} medan varken {3 2} eller {2 2} är en delsekvens av {1 2 3 4}.
a) Skriv en så generell implementation av subseq som möjligt och visa hur
du anropar den. 9p
b) I din implementation, är den tomma sekvensen (dvs sekvensen utan ele-
ment, { }) en delsekvens av {1 2 3 4}? 1p
1
3. Betrakta följande programkod:
const A * const foo(const A &) const;
const A & const far(const A &) const;
void bar(const int);
void baz(int);
void boo(const A &);
void bar(int) {}
void baz(const int) {}
void boo(A &) {}
a) Redogör för vad de fyra förekomsterna av const i funktionen foo har för
funktion. 4p
b) Deklarationen av funktionen far är inte syntaktiskt korrekt. Vad är pro-
blemet och varför är detta inte tillåtet? 3p
c) Både deklaration och definition för bar och baz är korrekta trots att de inte överensstämmer helt. Vad är orsaken till att detta är tillåtet? 3p d) Trots påståendet i uppgift c så överensstämmer definitionen för boo inte med deklarationen för boo. Vad är orsaken till detta? Ge gärna exempel
för att tydliggöra. 3p
4. När man skriver programkod som andra ska använda bör man dokumente- ra hur argumenten och returvärdet är tänkta att användas. För att ytterligare underlätta bör man så långt det går använda kompilatorn för att tvinga använ- daren till korrekt och effektiv användning.
a) Funktionen reverse vänder på elementen i en vektor. Vilken deklara- tion är att föredra av void reverse(std::vector &) och std::vector reverse(const std::vector &)? Motivera. 3p b) Vilken deklaration är att föredra av medlemsfunktionerna void operator+
(MyInt &) och MyInt operator+(const MyInt &)? Motivera. 3p c) Du implementerar en funktion get() och väljer mellan följande två dekla- rationer: A &get() och A *get(). De båda implementationerna exponerar olika gränssnitt för användaren. Beskriv i punktform för-och nackdelar i gränssnittet hos den första resp. den andra implementationen. 6p
2