• No results found

2D1387 Programsystemkonstruktion med C++

N/A
N/A
Protected

Academic year: 2021

Share "2D1387 Programsystemkonstruktion med C++"

Copied!
2
0
0

Loading.... (view fulltext now)

Full text

(1)

2D1387 Programsystemkonstruktion med C++

Lösningsförslag, tentamen 20 december 2000

Obs: Dessa lösningar är just lösningsförslag. Rättningen kan se något an- norlunda ut.

Uppgift 1

a) B B B (fast på tre rader)

b) Man bör ha virtuell destruktor när man har dynamiskt allokerat minne (dvs mednew) i någon subklass samt då man avser att klassen ska ärvas. Man behöver inte ha det om man inte har dynamiskt minne eller inte avser att klassen ska ärvas.

c) Tre exempel på motiveringar:

• Varje anrop till en virtuell funktion sker genom en pekare vilket ger extra instruktioner.

• Det kan vara svårt eller omöjligt för kompilatorn att göra en virtuell funk- tioninline.

• Virtuella funktioner ger insyn i din klass eftersom ärvda klasser då kan ändra beteendet.

Uppgift 2

template<class T>

T sum(T **m, int n) { T t;

for(int i = 0; i < n; i++) for(int j = 0; j < n; j++)

t += m[i][j];

return t;

}

Uppgift 3

Följande fyra defekter ger kompilatorfel:

• A::A() anropas implicit från B::B() men är privat.

• B::B() anropas från main() men är privat.

• B::B():j(2) försöker initiera medlem som inte ligger i B.

• A::i används i main() men är inte definierad.

(2)

Uppgift 4

a) Om e är const: konstanta variabler kan inte tilldelas, bara initieras. Om e är en referens: referenser måste alltid referera ett objekt och måste därför initieras före man når konstruktorns kropp.

b) Anropade funktioner i de två fallen:

• I fall (1): T::T(int).

• I fall (2): Först T::T() i initieringslistan, sedan typkonvertering (kon- struktion) mha T::T(int), sist tilldelning med T::operator=(const T

&).

c) Exempel på medlemsfunktioner som ges av kompilatorn:

• A::A(): anropar defaultkonstruktorn på de medlemmar som har en sådan.

• A::˜A(): anropar destruktorn på de medlemmar som har en sådan.

• A::A(const A &) (eventuellt A::A(A &) beroende på basklasser): anro- parT::T(const T &) för de medlemmar som har en sådan, övriga kopie- ras bitvis.

• A& A::operator=(const A &): anropar T::operator=(const T &) på de medlemmar som har en sådan, övriga kopieras bitvis.

• A* A::operator&(): returnerar this, dvs objektets plats i minnet.

References

Related documents

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

Skapa ytterligare en std::map och låt namnet på en aktör vara nyckeln till det objekt aktören representeras av.. När ett kommando verkar på en aktör,använd funktionspekaren