Tentamen i 2D1387 Programsystemkonstruktion med C++
Datum:25 oktober 2001
Hjälpmedel:Valfri lärobok i C++
Tid: 5 timmar
Skriv tydligt och ge motiveringar till dina svar. För godkänt krävs 25 poäng, för betyg fyra krävs 34 poäng och för betyg fem krävs 40 poäng. Alla betygs- gränser är inklusive bonuspoäng. Maxpoäng är 45 utan bonus. Maximalt antal bonuspoäng är nio.
1. Betrakta följande program:
struct A { int i;
virtual void foo() { std::cout << "A" << std::endl; } };
struct B : public A { int i;
virtual void foo() { std::cout << "B" << std::endl; } };
B b;
b.A::i = 7;
b.B::i = 8;
A *ap = &b;
A &ar = b;
A a = b;
std::cout << ap->i << std::endl;
std::cout << ar.i << std::endl;
std::cout << a.i << std::endl;
ap->foo();
ar.foo();
a.foo();
Vad skriver programmet ut och varför? 12p
2. Skriv en mallfunktion (template function) som summerar elementen i en vektor genom att använda operator+=:
int a[] = {0, 1, 2, 3, 4, 5};
std::list<int> l;
int i = sum_elems(0, a, a + 6) +
sum_elems(0, l.begin(), l.end());
std::set<std::string> s;
std::string str = sum_elems("", s.begin(), s.end());
Obs att första argumentet på sista raden inte är av typen std::string. 10p
1
3. Följande program har en del problem, bl.a. med minneshantering. Var uppstår
felen och varför? 10p
class A1 { virtual ~A1(); };
class A2 { };
class B1 : public A1 { char buf1[1024]; std::string s1; } class B2 : public A2 { char buf2[1024]; std::string s2; } A1 *a = new B1[5];
A1 *b = new B1;
A2 *c = new B2;
A2 *d = new B1;
delete a;
delete b;
delete c;
delete d;
4. När man skriver stora program delar man in sin kod i headerfiler (.h) och implementationsfiler (.cpp).
a) Vad är syftet med att dela upp sin kod på detta sätt? Vilka fördelar får
man av ett modulariserat program? 3p
b) Varför kan inte definitioner ligga i headerfilen? 3p c) inline och template är undantag från regeln i deluppgift b). Varför måste
dessa ligga i headerfilen? 3p
d) Vad skulle krävas av kompilatorn och länkaren för att tillåta att inline- och template-funktioner definieras i .cpp-filen? 4p
2