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
}
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;
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.
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();
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;
}
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;