Värmdö Gymnasium Programmering B Datainstitutionen
C++ Lektion Klasser grunder.doc
Sida 1 (4)
C++ Lektion Klasser grunder
Det mesta som berör klasser ligger på VG-nivå. G-nivån täcker exempel 1 och 2.
Teori
En klass är samma sak som en typ i C++. Du kan dock skapa mer avancerade typer än t.ex. heltal och tecken.
En enkel klass kan se ut på följande sätt:
class Elev {
public:
char namn[20];
int points;
};
Här kommer nu ett program som utnyttjar en motsvarande klass. Här skiljer man på de av klassens medlemmar (datamedlemmar/medlemsfunktioner) som är public resp. private. En medlem som är definierad private kan bara nås av klassens egna medlemmar, alla andra (t.ex. andra klasser eller
huvudprogrammet) som försöker läsa/skriva denna medlem kommer att få kompileringsfel. En medlem som är definierad public kan däremot läsas fritt av vilken programkod som helst.
//*** classex1.cpp ***
#include <iostream>
#include <string>
using namespace std;
//--- //Klassdeklarationen
class Elev {
public: // här deklareras datamedlemmar och medlemsfunktioner string namn; // datamedlemmar
int points;
}; //OBS! Semikolon
//--- // HUVUDPROGRAMMET classex1.cpp
main() {
Elev e1, e2;
e1.namn=”Kalle”; // punktoperator för att komma åt datamedlemmar e1.points=9;
e2.namn=”Musse”;
e2.points=22;
cout<<e1.namn<<”-”<<e1.points<<endl;
cout<<e2.namn<<”-”<<e2.points<<endl;
}
//---
Det var vårt första program som visar hur vi skapar en mall för hur den nya typen Elev får se ut och sen använder den i ett program.
När man vill skriva lite säkrare program så är det farligt att låta ”vem som helst” komma åt
datamedlemmarna i en klass. För att göra programmet säkert så vill man skydda dom och endast tillåta vissa saker. Vi sätter då datamedlemmarna som private och skriver egna funktioner som ligger i klassen (medlemsfunktioner) och dessa får påverka våra datamedlemmar på endast det sättet vi tillåter genom dessa funktioner. Detta blir ett mycket säkrare programmerande.
Värmdö Gymnasium Programmering B Datainstitutionen
C++ Lektion Klasser grunder.doc
Sida 2 (4)
Här följer hela koden för ett lite utökat program:
//*** classex2.cpp ***
#include <iostream>
#include <string>
using namespace std;
//---
class Elev {
private: // här deklareras gömda (utanför objektet) datamedlemmar och medlemsfunktioner string namn; // datamedlemmar
int points;
public: // här deklareras synliga (utanför objektet) datamedlemmar och medlemsfunktioner void skriv_in_data() // medlemsfunktioner
{
cout<<" Elevnamn: "; cin>>namn;
cout<<" Poäng: "; cin>>points; cout<<endl;
}
void skriv_ut_data() {
cout<<" Elevnnamn: "<<namn<<" Poäng: "<<points<<endl;
}
void increase_points(int x) {
points+=x;
} };
//--- // HUVUDPROGRAMMET class2ex.cpp
main() {
Elev e1, e2;
e1.skriv_ut_data(); // punktoperator för att komma åt medlemsfunktioner e1.skriv_in_data();
e2.skriv_in_data();
e1.skriv_ut_data();
e2.skriv_ut_data();
e1.increase_points(10);
cout<<endl;
e1.skriv_ut_data();
}
//---
OBSERVERA att vid den första utskriften av e1 så kommer skräp att skrivas ut.
Enda sättet att öka antalet poäng för en elev är att använda increase_points – funktionen eftersom points är deklarerad private. Det här är ett sätt att skapa en säkrare programmering, där ingen klåfingrig
programmerare kan ändra värdet i sitt program av misstag. Genom att ha en speciell funktion som gör detta är man säker på att detta bara kan ske kontrollerat.
Om det blir många stora medlemsfunktioner är det tillåtet (som när vi arbetade med funktioner tidigare) att endast skriva funktionsdeklarationen i klassen och sen t ex längst ner i programmet skriva
funktionsdefinitionen (dvs hela funktionen). I klassdefinitionen lägger man funktionsdeklarationer (forward-deklarationer, se funktionslektionen), medan definitionerna ligger längre ner, bland andra ev.
Värmdö Gymnasium Programmering B Datainstitutionen
C++ Lektion Klasser grunder.doc
Sida 3 (4)
funktioner. För att hålla reda på vilka funktioner som hör till vilken klass, anger man funktionshuvudet enligt följande modell:
returtyp klassnamn::funktionsnamn(ev. parametrar)
t.ex.
void Elev::SkrivUt()
Nu i början skapar vi inte så avancerade klasser och då kan det vara lämpligt att skriva allt i själva definieringen av klassen. Men för att visa hur det kan se ut så kommer här ovanstående program med funktionsdefinitionerna längst ner.
//*** classex3.cpp ***
#include <iostream>
#include <string>
using namespace std;
//--- //Klassdeklarationen
class Elev {
private: // här deklareras gömda (utanför objektet) datamedlemmar och medlemsfunktioner string namn; // datamedlemmar
int points;
public: // här deklareras synliga (utanför objektet) datamedlemmar och medlemsfunktioner void skriv_in_data(); // medlemsfunktioner
void skriv_ut_data();
void increase_points(int x);
};
//--- // HUVUDPROGRAMMET classex3.cpp
main() {
Elev e1, e2;
e1.skriv_ut_data(); // punktoperator för att komma åt medlemsfunktioner e1.skriv_in_data();
e2.skriv_in_data();
e1.skriv_ut_data();
e2.skriv_ut_data();
e1.increase_points(10);
cout<<endl;
e1.skriv_ut_data();
}
//***************************************************************
//definitioner av medlemsfunktioner i klassen
//skillnaden mot att definiera vanliga funktioner är att du måste // ange vilken klass de tillhör, här Elev::
void Elev::skriv_ut_data() {
cout<<" Elevnnamn: "<<namn<<" Poäng: "<<points<<endl;
}
void Elev::skriv_in_data() {
cout<<" Elevnamn: "; cin>>namn;
cout<<" Poäng: "; cin>>points; cout<<endl;
}
void Elev:: increase_points(int x) {
points+=x;
}
//***************************************************************
Läs
Läs kap15 i online-manualen.
Värmdö Gymnasium Programmering B Datainstitutionen
C++ Lektion Klasser grunder.doc
Sida 4 (4)
Öva Övning 1
Skriv in exemplen i denna lektion och häng med på vad programmen gör och vad som förändras i respektive program. Lämpligt är att utgå från ex1 och modifiera efterhand.
Övning 2
Skapa en klass Rektangel. Klassen skall ha dataattributen(datamedlemmarna) langd och bredd (typen float). Klassen skall ha operationerna area(), omkrets() och change(float sida1, float sida2). Skriv ett litet program där du testar din klass.
Övning 3
Skriv en klass Bankkonto. Klassen skall ha dataattributen(datamedlemmarna) saldo(typen float) och kontonr(10 tecken). Klassen skall ha operationerna insattning(float belopp), uttag(float belopp) och kontobesked(). Alla operationerna skall vara av typen void.
Själva klass deklarationen kan se ut enligt följande:
class Bankkonto {
public:
void insattning(float bel);
void kontobesked();
void uttag(float bel);
private:
float saldo;
int kontonr;
};
Implementera sedan metoderna och ett testprogram (huvudprogrammet) som testar din klass.
Övning 4
Skriv en klass som implementerar en tärning. Tärningen kan anta värdena 1 till 6. Möjliga operationer på tärningen skall vara
- Läsa värdet på tärningen.
- Kasta tärningen ett angivet antal gånger.
- Skriva ut statistik över tärningens historiska värden(hur många gånger den varit etta, tvåa etc) Skriv ett litet program där du testar din klass.
Utöka med flera tärningar.