• No results found

2D1387 Programsystemkonstruktion med C++ Lösningsförslag, tentamen 25 oktober 2003

N/A
N/A
Protected

Academic year: 2021

Share "2D1387 Programsystemkonstruktion med C++ Lösningsförslag, tentamen 25 oktober 2003"

Copied!
2
0
0

Loading.... (view fulltext now)

Full text

(1)

2D1387 Programsystemkonstruktion med C++

Lösningsförslag, tentamen 25 oktober 2003

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

Uppgift 1

Utskriften blir {

A a; // A()

B t; // A()

B b = t; // A(A) kopiering

A aa[3] = {a, b}; // A(A), A(A), A() tre A-objekt

A &ar1 = aa[1]; // referens till A

A &ar2 = b; // referens till B

ar1.foo(); // A::foo()

ar2.foo(); // B::foo()

} // sex stycken ~A()

Uppgift 2

a) Exempel på implementation som svarar på frågan om [it2, end2) är en delsekvens av [it1, end1).

template<class It1, class It2>

bool subseq(It1 it1, It1 end1, It2 it2, It2 end2) {

for(; it1 != end1; ++it1) {

if(it2 != end2 && *it1 == *it2) ++it2;

}

return it1 == end1 && it2 == end2;

}

// exempel på anrop:

int a[] = {1, 2, 3, 4};

int b[] = {1, 2, 3};

cout << subseq(a, a+4, b, b+3); // true

cout << subseq(a, a+4, b, b); // true, tom sekvens b) Implementationen ovan svarar true för en tom sekvens.

(2)

Uppgift 3

Konstanter, deklarationer och definitioner:

a) const A *: det utpekade minnet är skrivskyddat. A * const: man kan inte flytta den pekare man får som returvärde. const A &: man kan inte ändra det objekt referensen pekar ut. foo() const: man kan inte ändra det objekt som anropade medlemsfunktionen foo.

b) A & const är fel. Det finns inga skrivskyddade referenser eftersom referensen ändå inte kan tilldelas. Den kan bara initieras.

c) Det värde som skickas till bar och baz kopieras innan funktionen körs. Om argumentet är konstant eller inte påverkar bara implementationen. De två va- rianterna är följdaktligen ekvivalenta för anroparen och behandlas därför som samma överlagring.

d) Argument av typen A & resp. const A & ger två olika överlagringar av funk- tionen boo eftersom de två överlagringarna exponerar olika gränssnitt för an- vändaren (det ena kan ändra indatat, det andra inte). Exempel: i anropet const A a; boo(a); kan bara const A & anropas och i boo(A()) kan bara const A

& anropas av de två eftersom en icke-konstant referens inte kan bindas till en temporär variabel.

Uppgift 4

a) Den första varianten är effektivare eftersom den andra kopierar hela vektorn.

Priset blir att man inte behåller det ingående argumentet orört.

b) När man är osäker på vilken syntax en operator har bör man härma beteendet hos den inbyggda typen int. Den andra varianten uppfyller detta villkor. Den första varianten har en bakvänd semantik eftersom a + b verkar modifiera b genom den icke-konstanta referensen.

c) Huvudregel: man bör alltid föredra referenser. Har man inget objekt att referera till kan man kasta ett undantag. Annars bör man använda pekare för att kunna returnera null. Pekare används också när man pekar ut första elementet i en array. Problemet är då att mottagaren inte vet storleken på arrayen.

Att returnera pekare gör att gränssnittet blir otydligt. Har nytt minne allo- kerats och vem är då ansvarig för det minne som pekas ut? Om minne har allo- kerats, är det med new, new[] eller malloc? Om minnet allokerats med new[], vilken typ av objekt döljer sig bakom A *? Om arrayen består av nedärvda objekt finns inget sätt att förmedla detta och delete[] och pekararitmetik är direkt olämpliga på pekaren. Dessutom finns de vanliga problemen med pekare.

Måste jag testa för null vid varje anrop? Pekaren kan vara oinitierad, peka på redan frigjort minne eller ogiltigt minne, t.ex. förbi slutet på en array (såsom end() i STL). Syntaxen blir krångligare pga avrefereringen.

References

Related documents

Den sista radens operator[] skriver i strängen. Alltså måste vi allokera nytt minnesutrymme och kopiera över strängen innan vi skriver i det nya minnesutrymmet. Det är detta som

a) Skriv en generell implementation av apply. 8p b) Ge två exempel på hur du anropar apply. Låt sekvenserna vara en in- byggd array och en STL-behållare. Låt f vara en vanlig

b) Typkontroll av argument och returvärde, minskad risk för syntaxfel, de- buggning, mallar kan specialiseras, funktioner kan överlagras på antal element, makron kan inte

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

Obs: Dessa lösningar är just lösningsförslag.. A-objektet måste allokeras dynamiskt, vilket kan ta tid om det blir många små objekt som ska allokeras och avallokeras. Det

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