• No results found

Tentamen i 2D1387 Programsystemkonstruktion med C++

N/A
N/A
Protected

Academic year: 2021

Share "Tentamen i 2D1387 Programsystemkonstruktion med C++"

Copied!
3
0
0

Loading.... (view fulltext now)

Full text

(1)

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)

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

(3)

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

References

Related documents

• Skriv metoden bool move_event(const Date &amp; from, const Date &amp; to, std::string event) som kan flytta händelser i kalendern genom att först plocka ut och sedan lägga

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

på åtgärd där så är möjligt. För att minska kompileringstiderna och underlätta underhåll vill man undvika beroenden mellan klasser. Vi vill utöka klassen B genom att

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

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

b) Vilka effekter uppnås genom att göra konstruktor, destruktor, kopierings- konstruktor, tilldelningsoperator samt operatorerna new och delete till protected

Du vill skapa en trådklass Thread med följande egenskaper: Thread ska när tråden räknat klart frigöra sig själv och får därför inte allokeras på stacken. Trådens arbete ska

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, för betyg fem krävs 40 poäng. Alla betygsgränser är