• No results found

2D1387 Programsystemkonstruktion med C++ Lösningsförslag, tentamen 15 januari 2004

N/A
N/A
Protected

Academic year: 2021

Share "2D1387 Programsystemkonstruktion med C++ Lösningsförslag, tentamen 15 januari 2004"

Copied!
2
0
0

Loading.... (view fulltext now)

Full text

(1)

2D1387 Programsystemkonstruktion med C++

Lösningsförslag, tentamen 15 januari 2004

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

Uppgift 1

a) defaultkonstruktor A(), kopieringskonstruktor A(A), tilldelningsoperator oper=(A) och destruktor ˜A(). Dessutom får man adressoperatorn oper&() samt (de statiska) allokering- och avallokeringsoperatorerna oper new(), oper new[](), oper delete() och oper delete[]().

b)

int main() {

class A {};

A *ap = new A; // A() A *aa = new A[3]; // A() x 3

A a = *ap; // A(A)

a = *aa; // oper=(A)

delete ap; // ~A()

delete [] aa; // ~A() x 3 return 0;

} // ~A()

Uppgift 2

a) Exempel på program:

template<class It, class F>

void apply(It beg, It end, F f) {

for(; beg != end; ++beg) f(*beg);

}

b) Exempel på funktion och funktionsobjekt:

void add3(int &i) { i += 3; } struct Add {

Add(int j) : n(j) {}

operator()(int &i) { i += n; } int n;

};

std::vector<int> v(7);

int a[5] = { 1, 3, 2, 6, 0 };

apply(v.begin(), v.end(), Add(2)); // add 2 to each elem apply(a, a + 5, add3); // add 3 to each elem

(2)

Uppgift 3

struct A {

static void foo() {} // 1 static int bar() { return 0; } static const int i = 0; // 2 static const int j = 8; // 3

int k; // 4

int m;

int n;

class B {

B() : j(bar()), n(i) {} // 6, 7, 8 int n;

int j;

};

B b; // 5

};

1: en statisk funktion kan inte vara virtuell. 2: initieringsvärdet på en statisk konstant måste vara ett konstant värde, returvärdet från en funktion är inte ett konstant värde.3: icke-konstanta statiska variabler ska initieras utanför klassen.

4: medlemsvariabler kan bara initieras i konstruktorn. 5: klassen B ej deklarerad i sin ursprungliga position. Obs att A har tillgång till Bs privata konstruktor när B är en nästlad klass till A. 6: A är inte en basklass till B. 7: A::n är med- lemsvariabel och därför krävs ett objekt för åtkomst.8: m är inte en medlem i B.

Uppgift 4

a) Typkontroll, minskad risk för syntaxfel (t.ex. #define LEN 100;, där semi- kolon ställer till problem), debuggning (få kompilatorer har bra hantering av preprocessorkonstanter), räckvidd (preprocessorns konstanter syns i resten av filen.

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 konverteras till funktionspekare (och kan därför inte skickas som t.ex. argument till en funktion), argument till makron ger oönskat resultat vid blockstatiska variabler, makron kan inte ges defaultvärden.

c) Koden kan inte göras kompatibel med C vid användning av mallar, mallar kan öka kompileringstiden, makron är garanterat inline.

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

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

const A &amp; 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

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