• No results found

C++ Lektion Klasser grunder

N/A
N/A
Protected

Academic year: 2021

Share "C++ Lektion Klasser grunder"

Copied!
4
0
0

Loading.... (view fulltext now)

Full text

(1)

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.

(2)

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.

(3)

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.

(4)

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.

References

Related documents

politiken utspelas i och via medierna eftersom medierna utgör den största källan till politisk kunskap och information för medborgarna (Strömbäck, 2013:119, Asp, 1986, Strömbäck

Skriv ett program som sorterar med hänsyn på vald kolumn ( sortera tabellen så att det land som har högst temp i maj kommer överst, och självklart måste då även värden från

Vi är egentligen bara intresserade av att skicka information (ett eller flera värden) till en funktion som gör vissa beräkningar med hjälp av dessa värden och sen returnerar ett

Om vi deklarerar variabeln tecken som char så tolkas varje sifferkombination som ett visst tecken enligt en standard som kallas ASCII-standard.. Vi säger att talet är teckenkoden

Det innebär alltså att fältet själv inte kommer kopieras över till ett nytt fält som hör till funktionen (det som kallas värdeanrop, se tidigare), utan bara minnesadressen till

Skriv ett program som läser in dagens datum på formen 19åå-mm-dd , dvs en textsträng.. Sen läser du in en persons födelsedag på formen ååmmdd och skriver

Skriv ett program som analyserar en C++-fil (.cpp-fil) och ser hur många rader filen består av, hur många {-tecken, och }-tecken som finns, samt hur många (-tecken och )-tecken

Där anropade vi defaultkonstruktorn (den automatiskt genererade) när vi skapade objekt, samt så hade vi en funktion skriv_in_data( ) som vi använde för att lägga in ”värden”