Uppgift 1 (6 poäng)

a)
Förklara vad cin och cout är för något. Visa också ett konkret exempel på hur cin kan användas, det vill säga skriv ett litet program som visar detta.

b)
Skriv om funktionen max nedan till en mallfunktion så att den inte bara fungerar för typen int, utan även för andra lämpliga typer. Markera också den resulterande mallfunktionen som inline.

int max(int a, int b)
{
  return a > b ? a : b;
}

c)
Vilken utskrift erhålls när följande program exekveras?

class X
{
public:
    X() { cout << "Contructor X" << endl; }
    ~X() {cout << "Destructor X" << endl; }
};

class A
{
public:
    A() { cout << "Contructor A" << endl; }
    ~A() {cout << "Destructor A" << endl; }
};
 
 

class B: public A
{
public:
    B() { cout << "Contructor B" << endl; }
    ~B() {cout << "Destructor B" << endl; }
};
 

 

int main()

{

B b;

if (true) {
    A a;
}

cout << "Hacking C++" << endl;
    return 1
}

Uppgift 2 (6 poäng)

a)
Skapa en klass med namnet Date som beskriver datum. Ett datumobjekt skall initieras när det skapas. Gör instansvariablerna i klassen privata och lägg sedan till metoder som kan användas för att läsa instansvariablernas värden. Lägg också till en metod med namnet advance() som ändrar det datum som objekt beskriver till nästföljande datum. Kom ihåg att ta hänsyn till att vissa år är skottår, vilka har 366 dagar istället för 365 dagar, i din lösning. Denna extra dag infaller som 29 februari i förekommande fall: Ett skottår definieras av att årtalet är jämt delbart med 4, med inte jämt delbart med 100. Årtal som är jämt delbara med 400 utgår undantag från denna regel och är alltid skottår.

b)
Utöka klassen Date så att additionsoperator (operator+), "mindre-än"-operatorn (operator<) samt utskriftoperatorn (operator<<) överlagras på ett lämplig sätt. Följande exempel illustrerar hur dess operator skall kunna användas i samband med klassen Date.

Date today(1998, 6, 6);
Date aWeekLater(today + 7); // här utnyttjas operator+

cout << aWeekLater; // här utnyttjas operator<<
                    // raden skall ge utskriften: 1998-6-13

if ( aWeekLater < today ) // här används operator<
    cout << "I don't think so!" << endl;
 
 

Uppgift 3 (6 poäng)

a)
Klassen Person använder sig av klassen Date som du har nyss skapat. I klassen skall det finnas en metod som beräknar hur många hela år som aktuell person har levt utifrån det datum då personen föddes. Deklarationen för klassen är redan given nedan. Det återstår för dig att implementera de både konstruktörerna samt metoden som returnerar personers ålder.

class Persson
{
private:
    Date birth;
    char name[40];
public:
    Person (char * n, Date b);
    Person (char * n, int year, int month, int day);
    int age (Date & currentDate);
};

b)
Visa hur man kan använda klassen Person genom att du skriver ett kodfragment där först ett objekt instansieras som beskriver dig själv och sedan beräknas din ålder, som också skrivs ut på skärmen.

Uppgift 4 (5 poäng)

I ett större mjukvaruprojekt på företaget Single Inheritence Corp. har chefen uttryckligen förbjudit de involverade programmerarna att använda sig av multipelt arv. En älskare av multipelt arv, Harry Hacker, har emellertid lyckats med att smuggla in klassen BayWatch i projekt som ärver multipelt av klasserna Bay respektive Watch. Dessa klassers synliga interface ser ut enligt följande:

class Bay {
.....
public:
    Bay();
    void beware();
    bool sunny();
}

class Watch {
...
public:
    Watch();
    void reset();
    void start ();
    double stop ();
};

Harry Hackers klass ser ut på följande vis:

class BayWatch : public Bay, public Watch {
private:
    double level;
    double warning;
public:
    BayWatch () : level(0), warning(false) {}
    void getTan () { level += 0.1; }
    void noBrain { warning = true; beware(); reset (); }
};

Men Harry har avslöjats. Efter att ha vidtagit lämpliga åtgärder mot honom ber chefen dig att skriva om klassen. Du får inte använda multipelt arv, men klassen skall naturligtvis ha samma funktionalitet som förut, dvs. em användare av klassen skall inte märka någon skillnad sedan du implementerat den nya versionen av klassen.

Observera att det är endast klassen BayWatch som du skall skriva om! Du skall fortfarande utnyttja de färdiga klasserna Bay och Watch med inte genom multipelt arv.

Följande kod skall t.ex. fungera med samma resultat i båda fallen, det vill säga både före och efter dina förändringar.

BayWatch aBayWatchObject;

aBayWatchObject.start();

while ( aBayWatchObject.sunny() )
    aBayWatchObject.getTan();

if ( aBayWatchObject.stop() > 4.0)
    aBayWatchObject.noBrain();
 

Uppgift 5 (6 poäng)

Betrakta klasserna nedan tillsammans med den main()-funktion som använder dem. Visa sedan vad som skrivs ut när programmet körs. Tänk på att du måste motivera utförligt varför utskriften blir som den blir, rad för rad. Ange bland annat huruvida det är statisk eller dynamisk bindning som tillämpas för varje meddelande som skickas och förklara varför.

class A {
public:
    void m1 () { cout << "A::m1()" << endl ; }
    virtual void m2() { cout << "A::m2()" << endl ; }
    virtual void m3() { cout << "A::m3()" << endl ; }
    virtual void m4() = 0;
};

class B : public A {
public:
    void m1 ) { cout << "B::m1()" << endl ; }
    void m2() { cout << "B::m2()" << endl ; }
    void m3() { cout << "B::m3()" << endl ; }
    void m4() { cout << "B::m4()" << endl ; }
    void foo() { cout << "Bar" << endl ; }
};

int main()
{
    A * a_ptr;
    B b;
    b.m2();

    a_ptr = &b;
    a_ptr->m1();
    a_ptr->m2();
    a_ptr->m3();
    a_ptr->m4();

    B * b_ptr = dynamic_cast<B *> (a_ptr);
    if (b_ptr)
        b_ptr->foo();
    return 0;
}

Uppgift 6 (5 poäng)

Implementera en generell behållarklass med namnet Array. Klassen skall ha så kalllade mallparametrar, nämligen en typparameter och en värdeparameter, enligt följande:

telmplate <class T, int array_size>

Storleken (array_size) på behållaren skall alltså anges vid instansieringen av mallen vilket innebär att den är statisk bestämd vid kompileringstillfället. Behållarklassen skall således inte att använda sig i språket inbyggda primitiva arraytyperna. Nedanstående kod skall t.ex. fungera:
 

Array <int, 5 > a;
a[2] = 3;
int i = a[2];

Dessutom skall de gå att fråga ett objekt av klassen efter dess storlek. T.ex, så här:

for (int i =0; i< a.getSize(); i++}
    a[i] = 0;

Uppgift 7 (5 poäng)

Det finns en hel detaljer som en programmerare som använder C++ måste känna till för att lyckas konstruera bra klasser. Här nedan följer ett antal viktiga frågor som det är lämpligt att varje sådan klassförfattare begrundar. Besvara var och en av dessa frågor och motivera dina svar med lämpliga exempel.