Tentamen i 2D1387 Programsystemkonstruktion med C++
Datum: Fredag 14 januari 2005, 14-19
Hjälpmedel: En eller två valfria läroböcker om 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.
a) Vad skriver följande kod ut? Inga motiveringar behövs. Alla utskrifter börjar med antingen A: eller B:
b) Vilken skillnad skulle det bli om alla virtual togs bort? (Ange bara änd- ringarna inte hela den nya utskriften, motivera)
c) Förklara när och varför det är viktigt med virtuella destruktorer? Spelar det någon roll i det här exemplet? Motivera. 15p using namespace std;
struct A {
A(string s) : a_(s) { println("A konstrueras, a_=" + a_); } virtual ~A() { println("A destrueras, a_=" + a_); }
virtual void println(string s) { cout << "A: " << s << endl; } string a_;
};
struct B : public A {
B(string s) : A(s), b_(s) { println("B konstrueras, b_=" + b_); } virtual ~B() { println("B destrueras, b_=" + b_); }
virtual void println(string s) { cout << "B: " << s << endl; } string b_;
};
int main() {
A *ap = new B("ap");
ap->println("---"); // rakt streck delete ap;
B b("b");
b.println("---"); // rakt streck return 0;
}
1
2. sumElems summerar element i ett givet intervall i en vektor.
template<class T>
int sumElems(T it1, T it2) {
int ret = 0;
for (T t = it1; t != it2; ++t) ret += *t;
return ret;
}
a) Vilka krav ställer sumElems på indata? 3p
b) Beskriv hur sumElems kan förbättras och göras mer generell? 3p
c) Implementera ditt förslag. 3p
d) Vilka krav ställer din förbättrade version på indata? 2p
3.
a) Vad är en funktor? Vad är det för skillnad på en funktor och en funktion- spekare? Hitta på ett exempel där en funktor skulle vara mer användbar
än en funktionspekare. Motivera. 4p
b) Beskriv de implicit givna konstruktorerna defaultkonstruktor och kopie- ringskonstruktor. Hur fungerar de? När används de? 4p c) Varför är det viktigt att skriva en kopieringskonstruktor om klassen han- terar dynamiskt minne? Vilka andra metoder bör i så fall finnas med?
2p
2
4. Vilket eller vilka kompileringsfel har nedanstående kod? Numrera eventuella kompileringsfel k1, k2 ... Börja uppifrån. Motivera ditt svar. 9p using namespace std;
class A { public:
A(string s) : a_(s) { } // OK
void f1(A a) { cout << "f1: " << a.a_ << endl; } protected:
void f2(A a) { cout << "f2: " << a.a_ << endl; } string a_;
};
class B : public A { public:
B(string s) : A("base class"), b_(s) { } // OK void f3(A a) { cout << "f3: " << a.a_ << endl; } void f4(B b) { cout << "f4: " << b.b_ << endl; } void f5(A a) { cout << "f5: "; a.f1(*this); } void f6(A a) { cout << "f6: "; a.f2(*this); }
void f7(B b) { cout << "f7: " << this->a_ << endl; } void f8(B b) { cout << "f8: " << this->b_ << endl; } protected:
string b_;
};
int main() {
A a("a"); // OK A *ap = new B("ap"); // OK B b("b"); // OK a.f1(*ap);
a.f2(*ap);
b.f2(a);
b.f3(a);
b.f4(b);
b.f5(a);
b.f6(b);
b.f7(b);
b.f8(b);
delete ap; // OK
return 0; // OK
};
Rader med OK kompilerar. Det fattas inga semikolon. Felaktiga svar ger avdrag.
3